2009-06-17 7 views

Répondre

34

Il est le même que pour tous les types génériques et crus:

Class   // An unknown class (raw type) 
Class<?>  // An unknown class (generic version) 
Class<String> // The String class 

Dans ce cas particulier, il n'y a pas beaucoup de différence pratique entre Class et Class<?> parce qu'ils désignent tous deux une classe inconnue. En fonction des déclarations existantes, le compilateur peut demander un type générique au lieu d'un type brut.

Mais: Depuis Java 1.5, vous devez utiliser le formulaire générique dans la mesure du possible. Class<?> indique clairement que vous voulez dire "une classe inconnue", Class<String> indique clairement que vous voulez dire la classe String. Un Class brut pourrait signifier les deux. En fin de compte, cela ne fait pas beaucoup de différence pour le compilateur, mais cela fait une énorme différence en rendant les intentions de votre code plus compréhensibles et maintenables.

+2

Vous devez éviter la classe de classe chaque fois que possible ... –

+26

Vous devriez éviter d'utiliser des règles sans explications chaque fois que possible. –

10

Classe javadoc:

Paramètres Type: T - le type de la classe modélisé par cet objet Class. Par exemple, le type String.class est Class<String>. Utilisez Class<?> si la classe en cours de modélisation est inconnue.

Utilisation de Class sans paramètre de type est similaire à l'aide d'une classe générique (Map, List, etc.) sans paramètre de type - soit il est un usage de l'héritage pré-1.5 ou il est juste un segment de code qui ne se soucient pas de coulée de type non contrôlé.

2

La classe <?> montre que vous écrivez intentionnellement du code Java à 5 niveaux qui ne connaît pas ou ne se soucie pas de la classe avec laquelle vous traitez. En laissant de côté, cela ressemble à de l'ancien code ou code écrit par quelqu'un qui n'a pas encore appris les génériques.

1

"il ressemble à l'ancien code ou code écrit par quelqu'un qui n'a pas encore appris les génériques." Ceci est une déclaration correcte. Classe (prononcez "classe of unknown"), c'est-à-dire une classe dont le type correspond à n'importe quoi. C'est ce qu'on appelle un type wild-card pour des raisons évidentes.

par exemple:

public void drawAll(List<Shape> shapes) { 
    for (Shape s: shapes) { 
     s.draw(this); 
    } 
} 

règles de type disent que drawAll() ne peut être appelée sur les listes de exactement Shape: il ne peut pas, par exemple, être appelé, disons, un List<Circle>. C'est malheureux, puisque tout ce que fait la méthode est de lire les formes de la liste, donc ça peut aussi bien être appelé List<Circle>.

Ce que nous voulons vraiment, c'est que la méthode accepte une liste de n'importe quel type de forme.

public void drawAll (List <? extends Shape> shapes) { 

} 

en savoir plus: http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

Questions connexes