为什么这种自我引用的泛型分配是非法的?

时间:2012-04-18 03:35:37

标签: java generics

我很难理解为什么会发生以下错误。如果#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
    }
}

2 个答案:

答案 0 :(得分:9)

因为DATAIFoobar的一种类型,但不是相反。它没有什么不同:

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

答案 1 :(得分:5)

因为编译器知道DATA类型实现了IFoobar。但它并不知道所有IFoobar个对象实际上都是DATA个对象。简单地将DATA作为通用参数并不意味着什么;你也可以实现另一个实现IFoobar<DATA>的无关类。