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

mar*_*hon 5 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
    }
}
Run Code Online (Sandbox Code Playgroud)

mel*_*okb 9

因为DATA是一种类型IFoobar,但不是相反.它没有什么不同:

String d = null;
Object o = d;                //#1 ok
d = o;                       //#2 error
Run Code Online (Sandbox Code Playgroud)


Joh*_*eek 5

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