2012-04-18 20 views
5

Tôi gặp khó khăn trong việc hiểu tại sao lỗi dưới đây xảy ra. Nếu # 1 là ok, tại sao # 2 thì không?Tại sao phép gán Generics tự tham chiếu này là bất hợp pháp?

public interface IFoobar<DATA extends IFoobar> { 
    void bigFun(); 
} 

class FoobarImpl<DATA extends IFoobar> implements IFoobar<DATA> { 
    public void bigFun() { 
     DATA d = null; 
     IFoobar<DATA> node = d; //#1 ok 
     d = node;     //#2 error 
    } 
} 

Trả lời

9

DATA là loại IFoobar, nhưng không phải là cách khác. Không có gì khác biệt so với:

String d = null; 
Object o = d;    //#1 ok 
d = o;      //#2 error 
5

Bởi vì trình biên dịch biết rằng loại DATA thực hiện IFoobar. Nhưng nó không biết rằng tất cả các đối tượng IFoobar thực tế là đối tượng DATA. Chỉ cần có DATA làm thông số chung không có nghĩa là bất kỳ điều gì; bạn cũng có thể triển khai một lớp không liên quan khác thực hiện IFoobar<DATA>.

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