2012-04-18 12 views
5

Ho difficoltà a capire perché si verifica l'errore sottostante. Se # 1 è ok, perché non è il # 2?Perché questo incarico generico autoreferenziale è illegale?

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

risposta

9

Poiché DATA è un tipo di IFoobar, ma non viceversa. Non è diverso rispetto:

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

Poiché il compilatore sa che il tipo DATA implementa IFoobar. Ma è non sapere che tutti gli oggetti IFoobar sono in realtà oggetti DATA. Il semplice fatto di avere DATA come parametro generico non significa nulla; potresti anche implementare un'altra classe non correlata che implementa IFoobar<DATA>.

Problemi correlati