2011-02-04 41 views
10

Tôi đã lớp generic sau:generics java biên soạn lỗi

public class GenericClass<E,T extends Comparable<T>> 
{ 
    public static <E, T extends Comparable<T>> GenericClass<E, T> create() 
    { 
     return new GenericClass<E, T>(); 
    } 

    private GenericClass() 
    { 
    } 
} 

Và đây là cách tôi chỉ đơn giản là sử dụng nó:

GenericClass<MyClass, Double> set = GenericClass.create(); 

Eclipse biên soạn cho thấy không có lỗi, tuy nhiên - tòa nhà có kiến ​​cung cấp lỗi sau:

MyClass.java:19: incompatible types; no instance(s) of type variable(s) E,T exist so that GenericClass<E,T> conforms to GenericClass<MyClass,java.lang.Double> 
[javac] found : <E,T>GenericClass<E,T> 
[javac] required: GenericClass<MyClass,java.lang.Double> 
[javac]    GenericClass<MyClass, Double> set = GenericClass.create(); 

Cảm ơn!

+0

Và SortedSetByDoubleValue là ...? –

+0

Đã sửa lỗi ... Tôi đã thay đổi tên lớp để đơn giản – duduamar

+0

Đề xuất của tôi là không sử dụng cùng tên cho các loại chung trong phương thức tạo tĩnh và lớp. Mặc dù về mặt pháp lý về mặt kỹ thuật, nó có thể dẫn đến một số sai lầm điên rồ khó phát hiện. Tôi mạnh mẽ đề xuất thay thế E, T bằng E2 và T2 (hoặc bất kỳ thứ gì) trong toàn bộ định nghĩa create(). –

Trả lời

8

Hãy thử sử dụng này:

 GenericClass<String, Double> set = GenericClass.<String,Double>create(); 

biên dịch Eclipse và javac khác nhau về sự khoan dung của họ.

+1

Vậy thì Sets.newHashSet() của Google (ví dụ) hoạt động như thế nào? Sự khác biệt là gì? – duduamar

+0

@duduamar: 'newHashSet()' ít phức tạp hơn: nó không có giới hạn đối với hai đối số kiểu. –

+0

Cool ... đã học được điều gì đó mới mẻ. Cảm ơn tất cả – duduamar

0

Biểu thức của bạn GenericClass.create() không có dấu hiệu của loại, do đó trình biên dịch không thể suy ra loại thực của E và T. Bạn cần thay đổi nguyên mẫu của hàm để trợ giúp trình biên dịch.

Cách đơn giản nhất là chuyển các lớp học.

Ví dụ:

public class GenericClass<E,T extends Comparable<T>> { 
    public static <E, T extends Comparable<T>> GenericClass<E, T> create(Class<E> e, Class<T> t) { 
     return new GenericClass<E, T>(); 
    } 

    private GenericClass() { 
    } 
} 

GenericClass<MyClass, Double> set = GenericClass.create(MyClass.class, Double.class); 
+0

Trình biên dịch * nên * có thể suy ra loại. Và nó có thể (như trình biên dịch eclipse thể hiện rõ ràng). Tôi đã tìm thấy các lỗi tương tự trong đó 'javac' không thể suy ra các loại và trình biên dịch eclipse có thể. Mỗi lần tôi đã đệ trình các lỗi cho nó (với cả Eclipse và Sun/Oracle), nó trở thành 'javac' có lỗi. –

+0

Có ... nhưng javac là tài liệu tham khảo ;-) Dù sao, tôi đã học được điều gì đó mới nhờ Grzegorz. – cadrian