Pourquoi est-ce que Java Class<T>
générique ?
Réponses
Trop de publicités?Voici un résumé assez bon des avantages : http://download.oracle.com/javase/tutorial/extra/generics/literals.html
Il y a une brève mention à ce sujet dans les Génériques de la version 1.5 du guide linguistique :
Plus surprenant, la classe La classe a été généralisée. Les littéraux de classe fonctionnent maintenant comme des jetons de type, fournissant des informations de type à l'exécution et à la compilation. Cela permet un style de fabriques statiques illustré par la méthode getAnnotation de la nouvelle interface AnnotatedElement :
<T extends Annotation> T getAnnotation(Class<T> annotationType);
Il s'agit d'une méthode générique. Elle déduit la valeur de son paramètre de type T à partir de son argument, et renvoie une instance appropriée de T, comme l'illustre l'extrait suivant :
Author a = Othello.class.getAnnotation(Author.class);
Avant l'apparition des génériques, vous auriez dû convertir le résultat en Author. De plus, vous n'aviez aucun moyen de faire en sorte que le compilateur vérifie que le paramètre réel représentait une sous-classe d'Annotation.
La véritable raison est donnée par Neil Gafter :
Quand on a ajouté les génériques à Java dans le JDK5, j'ai changé la classe java.lang.Class pour qu'elle devienne un type générique. Par exemple, le type de String.class est maintenant Class < String > . Gilad Bracha a inventé le terme type pour cela. Mon intention était d'activer un style particulier d'API, que Joshua Bloch appelle le THC, ou Typesafe Heterogenous Container. modèle.
Il vous permet de créer des classes qui manipulent des objets de différents. Pensez à l'enfer que ce serait si vous deviez écrire une liste pour chaque classe présente dans votre projet. Au lieu d'écrire des choses comme :
public class IntegerList {
...
public insert(int element);
...
}
et
public class StringList {
...
public insert(String element);
...
}
Vous pouvez créer :
public class List<T> {
...
public insert(T element);
...
}
et l'utiliser comme :
List<Integer> intList = new List<Integer>();
intList.insert(1);
List<String> stringList = new List<String>();
stringList.insert("a");