J'essaie de comprendre les types génériques en Java, et en théorie, cela semble compréhensible, mais lorsque je dois l'appliquer à du code réel, j'ai des problèmes. Je veux déclarer une méthode abstraite qui retournera un type générique. Supposons que j'ai une interface vide appelée Magicable et que 2 classes l'implémentent : Magicien et Sorcière. Maintenant je me demande quelle est la différence entre ces 3 déclarations :
/*1*/protected abstract <T extends Magicable> List<T> getMagicables();
/*2*/protected abstract List<? extends Magicable> getMagicables();
/*3*/protected abstract List<Magicable> getMagicables();
-
Dans le premier cas, j'ai un problème lorsque je veux implémenter le corps de cette méthode dans une classe qui étend la classe abstraite :
@Override protected List<Magican> getMagicable() {..}
J'ai un message d'avertissement :
Sécurité du type : Le type de retour List<Magican> pour getMagicable() du type MagicanService nécessite une conversion non vérifiée pour être conforme à List<Magicable> du type MagicableService.
-
Dans le deuxième cas, je n'ai pas cet avertissement, mais j'ai un problème dans la classe abstraite dans laquelle j'ai déclaré la méthode abstraite ci-dessus :
public void <T extends Magicable> T getOneFromList() { List<T> list = getMagicables(); //..... }
Dans ce cas, j'ai une erreur de compilation dans l'appel getMagicables() :
Erreur de type : impossible de convertir une liste<capture#2-of ? extends Magicable> en liste<T>.
-
Le troisième cas provoque des erreurs de compilation dans les deux endroits du code mentionnés ci-dessus. Je ne pense pas que ce soit la bonne solution dans mon cas.