Selon ma compréhension, la fonction générique suivante en Java:
public static <T extends Integer> T f(T x) { Integer[] arr = new Integer[4]; T ret = (T) arr[2]; return ret; }
3 Réponses :
Quelqu'un avec plus de connaissances dans ce sujet pourrait sauter plus tard, pendant que mon humble explication est la suivante: p>
Ce que vous dites a raison, les génériques ont espère que cela aide! p>
Dans votre exemple, le compilateur figure que le type de retour est le même type que le paramètre transmis à la fonction, car ils sont tous deux paramétrés sur Taper T, qui est résolu à être entier code>. Lors de la génération du bytecode, il Efface le type Informations sur les paramètres. P>
C'est intéressant. Mais le JVM ne se plaignait-il pas au moment de l'exécution depuis que l'objet renvoyé est d'objet de type?
Pourquoi pourrait-il se plaindre de cela? Un entier est I> un objet, ils sont tous deux implémentés en interne comme un pointeur à un morceau de mémoire. C'est fondamentalement la même chose que le casting, à l'exception de la JVM ne gêne pas la vérification des types car elle sait que la distribution est en sécurité.
Generics utilise le type d'effacement du type. Cela signifie fondamentalement que les génériques ne sont rien de plus que des moulages implicites, donc lorsque vous faites:
Integer i = (Integer)f(new Integer(4));
Je ne pense pas que "Covariant" signifie que leurs types sont retenus au moment de l'exécution ... Ne pas avoir quelque chose à faire avec l'héritage et si une sous-classe peut prendre la place d'une superclasse?
@Pablo: Voir DeveloperTutorials.com/tatudials/java/ ...
drôle. Dans le premier paragraphe de ce blogpost dit: "Les tableaux dans la langue Java sont covariants - ce qui signifie que si entier code> étend
numéro code> (lequel il fait), alors non seulement un
INTEGER code> Aussi un numéro
code>, mais un
intergé [] code> est également un numéro
[] code> "
Pablo Fernandez est correct, la covariance n'a rien à voir avec le fait qu'un type est conservé au moment de l'exécution. Le mot que vous recherchez est "réifié".
Vous auriez pu choisir un exemple plus agréable :)
En fait, ma question est vraiment comment le compilateur comprend le type de retour correct pour les fonctions génériques?