2012-04-18 29 views
5

我很難理解爲什麼會發生下面的錯誤。如果#1沒問題,爲什麼#2不是?爲什麼這種自引用泛型指派是非法的?

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 
    } 
} 

回答

9

因爲DATA是一種類型的IFoobar,而不是周圍的其他方式。它沒有比不同:

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

因爲編譯器知道DATA類型實現IFoobar。但它並不是知道所有的IFoobar對象實際上是DATA的對象。簡單地將DATA作爲通用參數並不意味着什麼;你也可以實現另一個實現IFoobar<DATA>的無關類。

相關問題