2010-03-12 21 views
10

tôi có các phương pháp sau:Generics Java: Vấn đề của trình biên dịch ở đây là gì? ("Không có trường hợp tối đa độc đáo")

public <T> T fromJson(Reader jsonData, Class<T> clazz) { 
    return fromJson(jsonData, (Type)clazz); 
} 

public <T> T fromJson(Reader jsonData, Type clazz) { 
    ... 
} 

Trình biên dịch là nói về phương pháp đầu tiên:

type parameters of <T>T cannot be determined; 
no unique maximal instance exists for type variable T 
with upper bounds T,java.lang.Object 

return fromJson(jsonData, (Type)clazz); 
       ^

vấn đề là gì?

Trả lời

16

Vấn đề là định nghĩa của phương pháp thứ hai:

public <T> T fromJson(Reader jsonData, Type clazz) { 

Không có cách nào cho trình biên dịch để nói những gì loại T có thể có. Bạn phải trả lại Object tại đây vì bạn không thể sử dụng Type<T> clazz (Type không hỗ trợ Generics).

Điều này dẫn đến dàn diễn viên (T) trong phương pháp đầu tiên sẽ gây ra cảnh báo. Để loại bỏ cảnh báo đó, bạn có hai tùy chọn:

  1. Cho trình biên dịch biết loại. Sử dụng điều này (lẻ) Cú pháp:

    this.<T>fromJson(jsonData, (Type)clazz); 
    

    Lưu ý rằng bạn cần this đây vì <T>fromJson() thôi thì cú pháp bất hợp pháp.

  2. Sử dụng chú thích @SuppressWarnings("unchecked").

+0

có ý nghĩa, cảm ơn – Epaga

+0

Câu trả lời này không đúng. Mặc dù việc thực hiện phương thức thứ hai là * có thể * không an toàn kiểu (chúng ta không thể thấy việc thực hiện ở đây), không có gì * kỹ thuật * sai về việc khai báo phương thức thứ hai. – newacct

+0

Đó không phải là những gì tôi nói. Đối số của tôi là 'Type' không có tham số chung, do đó, các diễn viên đổ bóng' T' từ 'Class ' mà trình biên dịch nên sử dụng, do đó lỗi. Nhưng bạn chính xác rằng bạn có thể nói cho trình biên dịch biết loại có 'điều này. '. Tôi đã cải thiện câu trả lời của mình. –

13

Tôi gặp phải vấn đề tương tự và nhận thấy đó là lỗi (#6302954) trong JDK. Nó đã được sửa trong jdk 6u25.

Tôi đã làm việc xung quanh một trong các trường hợp của vấn đề này nhưng thay vào đó quyết định cập nhật phiên bản JDK trên hộp CI.

2

Điều này có vẻ như thất bại trong suy luận. Phương thức đầu tiên rõ ràng có ý định gọi phương thức thứ hai với đối số kiểu là cùng một tham số kiểu T mà nó có. Nhưng có lẽ trình biên dịch không thể tìm ra nó vì hệ thống suy luận của nó không đủ tốt.

Trong mọi trường hợp, bạn sẽ có thể xác định rõ ràng các đối số kiểu và nó sẽ thoát khỏi các lỗi:

public <T> T fromJson(Reader jsonData, Class<T> clazz) { 
    return this.<T>fromJson(jsonData, (Type)clazz); 
} 
1

tôi quá Đã có một vấn đề tương tự khi biên dịch trong NetBeans. Tất cả những gì tôi phải làm là thay đổi phiên bản JDK từ 16 bit xuống 32 bit trong Cài đặt> Biên dịch> Nền tảng Java.

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