2012-01-08 2 views
2

Je ne comprends pas. En java je suis autorisé à déclarer une interface comme un type de retour d'une méthode, comme:Pourquoi ce type de retour générique d'une méthode n'est pas valide

public List<String> get(){ 
    return new ArrayList<String>(); 
} 

si j'ai maintenant une interface permet de dire I et une classe C mise en œuvre, pourquoi je ne suis pas autorisé à définir comme ceci:

public List<I> get(){ 
    return new ArrayList<C>(); 
} 

Je sais que la solution pour créer un ArrayList<I> et ajouter à C, mais je me demande pourquoi je ne suis pas autorisé à le déclarer comme celle-ci. Je pensais que chaque C est également un I mais il ne devrait pas y avoir de problème.

Répondre

10

Vous ne pouvez pas faire cela car List<I> et List<C> sont des types incompatibles.

Vous pouvez le faire, mais

public List<? extends I> get(){ 
    return new ArrayList<C>(); 
} 
+0

me battre à elle! 1+ –

4

Vous exécutez dans un problème avec coopération et contravariance. Pour faire court: votre interface List<I> a également une méthode Add, qui attend une instance de I, mais pas tous I sera en fait implémentée par C, comme toute autre classe peut également implémenter I. Par conséquent, vous allez vous retrouver avec des problèmes de typage.

Questions connexes