10
votes

Comment la fonction générique est-elle mise en œuvre dans Java?

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


2 commentaires

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?


3 Réponses :


6
votes

Quelqu'un avec plus de connaissances dans ce sujet pourrait sauter plus tard, pendant que mon humble explication est la suivante:

Ce que vous dites a raison, les génériques ont Erasure de type ce qui signifie que des informations génériques ne sont pas disponibles au moment de l'exécution. il est mais disponible à compile heure et c'est la manière dont le compilateur peut déterminer que vous mélangez des types.

espère que cela aide!


0 commentaires

2
votes

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 . Lors de la génération du bytecode, il Efface le type Informations sur les paramètres.


2 commentaires

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 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é.



7
votes

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));


4 commentaires

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 étend numéro (lequel il fait), alors non seulement un INTEGER Aussi un numéro , mais un intergé [] est également un numéro [] "


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é".