2012-01-09 39 views
10

Tôi đang cố gắng biên dịch mã như dưới đây bằng cách sử dụng JDK1.5.0_u22. Tôi nhận được hai lỗi biên dịch (thêm bên dưới). Nó hoạt động tốt với JDK1.6.0u30, nhưng dự án của tôi bị giới hạn ở Java 5. Nó cũng hoạt động tốt nếu tôi repleace float với lớp wrapper Float. Có ai biết chuyện gì đang xảy ra ở đây không? Một lỗi đơn giản hoặc một số hạn chế chung về việc sử dụng các kiểu mảng nguyên thủy trong các tình huống chung?Điều gì là sai khi sử dụng một mảng nguyên thủy như một tham số kiểu thực trong Java 5?

import java.util.*; 
public class A { 
    public static void main(String[] args) { 
    List<float[]> list = Arrays.asList(new float[1], new float[3]); 
    float[] key = new float[2]; 
    int index = Collections.binarySearch(list, key, new Comparator<float[]>() { 
     public int compare(float[] f1, float[] f2) { 
      return f1.length - f2.length; 
     } 
    }); 
    System.out.println(index); 
    } 
} 

Biên dịch lỗi:

C:\Users\mravn\Desktop>"c:\Program Files\Java\jdk1.5.0_22"\bin\javac A.java 
A.java:4: incompatible types 
found : java.util.List<<nulltype>[]> 
required: java.util.List<float[]> 
     List<float[]> list = Arrays.asList(new float[1], new float[3]); 
            ^
A.java:6: cannot find symbol 
symbol : method binarySearch(java.util.List<float[]>,float[],<anonymous java.util.Comparator<float[]>>) 
location: class java.util.Collections 
    int index = Collections.binarySearch(list, key, new Comparator<float[]>() { 
          ^
2 errors 

C:\Users\mravn\Desktop> 
+0

http://stackoverflow.com/questions/788433/can-you-pass-an-int-array-to-a-generic-method-in-java điều này có thể cung cấp cho bạn một số thông tin chi tiết –

+0

Tôi đã sao chép mã như là và có thể biên dịch và chạy nó mà không có lỗi dưới jdk1.5.0_22. – r3nj1

+0

Lạ. Bạn đã sử dụng javac do Oracle cung cấp chưa? Sử dụng nhật thực, nó hoạt động cho tôi. – mravn

Trả lời

7

tôi sẽ cung cấp cho các câu trả lời cho các lỗi biên dịch 1 và tiếp tục đào để xem nếu tôi có thể tìm ra một cho lỗi biên dịch 2nd ...

Chạy sau tự sản xuất không có lỗi sử dụng jdk1 .5.0_22:

System.out.println(Arrays.asList(new float[1]).size()); 

Chạy điều này bằng cách riêng của mình ...

System.out.println(Arrays.asList(new float[1], new float[3]).size()); 

sản xuất lỗi biên dịch khó chịu này ...

An exception has occurred in the compiler (1.5.0_22). Please file a bug at the Java Developer Connection (http://java.sun.com/webapps/bugreport) after checking the Bug Parade for duplicates. Include your program and the following diagnostic in your report. Thank you. 
java.lang.AssertionError: unexpected type: <nulltype> 
     at com.sun.tools.javac.tree.TreeMaker.Type(TreeMaker.java:531) 
     at com.sun.tools.javac.tree.TreeMaker.Type(TreeMaker.java:525) 
     at com.sun.tools.javac.comp.Lower.boxArgs(Lower.java:2510) 
     at com.sun.tools.javac.comp.Lower.visitApply(Lower.java:2420) 
     at com.sun.tools.javac.tree.Tree$Apply.accept(Tree.java:813) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1881) 
     at com.sun.tools.javac.comp.Lower.visitSelect(Lower.java:3019) 
     at com.sun.tools.javac.tree.Tree$Select.accept(Tree.java:987) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1881) 
     at com.sun.tools.javac.comp.Lower.visitApply(Lower.java:2474) 
     at com.sun.tools.javac.tree.Tree$Apply.accept(Tree.java:813) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1881) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1893) 
     at com.sun.tools.javac.comp.Lower.boxArgs(Lower.java:2517) 
     at com.sun.tools.javac.comp.Lower.visitApply(Lower.java:2420) 
     at com.sun.tools.javac.tree.Tree$Apply.accept(Tree.java:813) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1881) 
     at com.sun.tools.javac.tree.TreeTranslator.visitExec(TreeTranslator.java:227) 
     at com.sun.tools.javac.tree.Tree$Exec.accept(Tree.java:728) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1881) 
     at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:54) 
     at com.sun.tools.javac.tree.TreeTranslator.visitBlock(TreeTranslator.java:145) 
     at com.sun.tools.javac.comp.Lower.visitBlock(Lower.java:2933) 
     at com.sun.tools.javac.tree.Tree$Block.accept(Tree.java:535) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1881) 
     at com.sun.tools.javac.tree.TreeTranslator.visitMethodDef(TreeTranslator.java:129) 
     at com.sun.tools.javac.comp.Lower.visitMethodDefInternal(Lower.java:2267) 
     at com.sun.tools.javac.comp.Lower.visitMethodDef(Lower.java:2186) 
     at com.sun.tools.javac.tree.Tree$MethodDef.accept(Tree.java:478) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1881) 
     at com.sun.tools.javac.comp.Lower.visitClassDef(Lower.java:1989) 
     at com.sun.tools.javac.tree.Tree$ClassDef.accept(Tree.java:434) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1881) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1901) 
     at com.sun.tools.javac.comp.Lower.translateTopLevelClass(Lower.java:3070) 
     at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:487) 
     at com.sun.tools.javac.main.Main.compile(Main.java:592) 

Vì vậy, tôi đã làm theo lời khuyên của trình biên dịch và đã thực hiện một số tìm kiếm trên cơ sở dữ liệu lỗi của Oracle và tìm thấy lỗi bằng cách tìm kiếm "java.lang.AssertionError: unexpected type:". Bạn có thể xem tại đây: Primitive arrays and varargs inference leads to crash in TreeMaker.Type(TreeMaker.java:531)

Sử dụng lớp trình bao nổi là công việc xung quanh khi bạn phát hiện ra.

EDIT - câu trả lời cho lỗi biên dịch 2

tôi tin rằng các lỗi biên dịch thứ 2 là một lỗi và tôi đã gửi nó vào Bug Database

tôi đã có thể biên dịch danh sách sau đây, chìa khóa và so sánh của mình không có lỗi biên dịch:

List<float[]> list=new ArrayList<float[]>(); 
list.add(new float[] {0.0f}); 
list.add(new float[] {1.0f}); 

float[] key = new float[2]; 

Comparator<float[]> c = new Comparator<float[]>() { 
    public int compare(float[] f1, float[] f2) { 
     return f1.length - f2.length; 
    } 
}; 

Khi tôi cố gắng chạy "Collections.binarySearch (danh sách, chìa khóa, c)" với họ, tôi nhận được báo lỗi "không thể tìm thấy biểu tượng". Nếu tôi thay đổi "float" thành "Float", nó sẽ biên dịch tốt với cả hai trường hợp.

Tôi tin rằng danh sách, chìa khóa và so sánh tôi đã đăng ở trên đáp ứng các hợp đồng tìm kiếm nhị phân hoàn toàn theo Java 5 spec on it

+0

Cảm ơn - hóa ra người ta có thể gặp lỗi đầu tiên bằng cách chỉ cung cấp gợi ý cho trình biên dịch: Mảng. asList (...). Đối với lỗi thứ hai, tôi đã tìm thấy không có gì ngoại trừ việc sử dụng một Comparator với hai (float []) phôi trong việc thực hiện phương pháp. – mravn

+0

Có - Tôi đã đọc nội dung nào đó dọc theo các dòng của Mảng. trên cơ sở dữ liệu lỗi - "Arrays.binarySearch không thể suy ra int []" - id lỗi = 5070671 –

0

Một cách giải quyết có thể là để biên dịch với JDK 6 và thiết lập -target 1.5, sau đó nó sẽ có thể để chạy nó với jdk 1.5.0_22 (thử trên một hộp linux) .

+0

Giống như tôi đã nói, nó hoạt động tốt cho tôi quá sử dụng JDK6. Vấn đề chỉ xuất hiện với JDK5. Tôi không sử dụng bất kỳ cờ biên dịch nào, chỉ đơn giản là javac (xem bài đăng) – mravn

+1

Đây phải là một nhận xét thay thế. –

+0

Anh ấy đang gặp vấn đề trong Java 5 ... –

0

Generics không xử lý nguyên thủy nhất quán. Điều này là bởi vì Generics nó chỉ là một bổ sung thời gian biên dịch cho một lớp duy nhất.

Các vấn đề liên quan