
Envoyé par
kimjoa
Je comprends pas pourquoi ....avec cette syntaxe réduite c'est comme si T et U était en faite le même template ...
... Supposons que tu veuilles avoir deux paramètre T et U, en n'imposant aucune contrainte sur T et en imposant que U étende TreeNode.
Ça ressemblerait à quoi ? Écris-le. Compare avec ta "syntaxe réduite."
Cette remarque sur la syntaxe étant faite, est-ce que ce n'est pas plus simple de faire ton constructeur ainsi :
public Test(List<? extends TreeNode>, List<? extends TreeNode>) {
?
Je sais pas si je fait bien d'inclure des paramètres générique dans la seconde méthode. En effet elle ne fait que caster dynamiquement son résultat au type déclaré de la variable affecté par son invocation.
La première fait encore moins que ça, elle rassure le compilateur en lui disant que la liste renvoyée est une liste du type attendu, sans jamais s'en assurer. Ce qui provoquera tôt ou tard des ClassCastException, à un endroit moins attendu que là où ça devrait.
Sauf si la liste est vide, mais j'imagine que ce n'est pas le but.
J'ai pas mal de getters, et si j'applique la généricité au paramêtre qui ne sont pas des collections, je suis dans le

Pourtant ça semblerais plus logique de faire ainsi puisse que les retours de mes collections sont générique, ce qui reste super pratique ....
C'est ta classe, pas tes méthodes, qu'il faut paramétrer, voyons ! Les paramètres de méthodes se perdent d'un appel de méthode à l'autre. Ce qu'il te faut, c'est lier le paramètre à une instance de la classe, pour qu'il soit retenu pour tous les appels de méthodes. Et ça c'est un paramètre de classe.
Partager