2012-04-18 15 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の種類ではなく、周りの他の方法です。コンパイラはDATAタイプはIFoobarを実装していることを知っているので

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

:それはよりも異なるません。しかしそれはではないすべてのIFoobarオブジェクトは実際にはDATAオブジェクトです。単純にDATAを汎用パラメータとして持つことは意味を持ちません。 IFoobar<DATA>を実装する別の無関係なクラスを実装することもできます。

関連する問題