51 votes

Pourquoi la classe<T> de Java est-elle générique ?

Pourquoi est-ce que Java Class<T> générique ?

33voto

Steve B. Points 23227

Pour que les méthodes typées génériques puissent être utilisées -

Class<Foo> klass = Foo.class;
Foo f = klass.newInstance();
Foo f = klass.cast(Object);

15voto

Chris Arguin Points 6469

14voto

Bill the Lizard Points 147311

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.

8voto

JVerstry Points 12414

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.

-3voto

freitass Points 2488

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X