2012-04-18 9 views
5

Estoy teniendo dificultades para entender por qué ocurre el siguiente error. Si # 1 está bien, ¿por qué el # 2 no?¿Por qué esta asignación genérica autorreferencial es ilegal?

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

Respuesta

9

Debido DATA es un tipo de IFoobar, pero no al revés. No es diferente de:

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

Debido a que el compilador sabe que el tipo DATA implementa IFoobar. Pero no sabe que todos los objetos IFoobar son en realidad objetos DATA. Simplemente tener DATA como parámetro genérico no significa nada; también podría implementar otra clase no relacionada que implemente IFoobar<DATA>.

Cuestiones relacionadas