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

2 回答 2

9

因为DATA是 的一种IFoobar,但反之则不然。这与以下没有什么不同:

String d = null;
Object o = d;                //#1 ok
d = o;                       //#2 error
于 2012-04-18T03:40:56.097 回答
5

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

于 2012-04-18T03:41:38.607 回答