En contraste .NET, Java génériques sont mis en œuvre par une technique dite de type "effacement".
Ce que cela signifie, c'est que le compilateur utilisera le type d'informations lors de la génération des fichiers de classe, mais pas le transfert de cette information pour le byte code. Si vous regardez les classes compilées avec javap ou d'autres outils similaires, vous trouverez que List<String>
est un simple List
(de Object
) dans le fichier de classe, comme il était en pré-Java-5 du code.
Code d'accès à la Liste générique sera "réécrit" par le compilateur d'inclure la jette, vous devez écrire vous-même dans les versions antérieures. En effet, la suite de deux fragments de code sont identiques d'un octet de code perspective, une fois que le compilateur est fait avec eux:
Java 5:
List<String> stringList = new ArrayList<String>();
stringList.add("Hello World");
String hw = stringList.get(0);
Java 1.4 et avant:
List stringList = new ArrayList();
stringList.add("Hello World");
String hw = (String)stringList.get(0);
Lors de la lecture des valeurs à partir d'une classe générique en Java 5 le nécessaire de lancer pour le type déclaré paramètre est automatiquement inséré. Lors de l'insertion, le compilateur vérifiera la valeur que vous essayez de les mettre dans l'abandon et avec une erreur si elle n'est pas une Chaîne.
Le tout a été fait pour garder les anciens des bibliothèques et de la nouvelle generified code interopérables, sans avoir à recompiler l'existant libs. C'est un avantage majeur sur le .NET moyen, où les classes génériques et non génériques vivre côte-à-côte, mais ne peuvent pas être échangées librement.
Les deux approches ont leurs avantages et leurs inconvénients, mais c'est la façon dont il est en Java.
Pour en revenir à votre question initiale: Vous ne serez pas en mesure d'obtenir les informations de type à l'exécution, parce que simplement, il n'est plus là, une fois que le compilateur a fait son travail. C'est sûrement la limitation à certains égards, et il y a quelques grincheux des moyens autour d'elle qui sont généralement basés sur le stockage de classe-instance quelque part, mais ce n'est pas une fonction standard.