Ce n'Classe Moyenne en Java?
Question comme ci-dessus, désolé c'est probablement un doublon mais je n'ai pas pu trouver un exemple avec le <?>
à la fin.
Pourquoi n'utiliseriez-vous pas simplement Class
comme paramètre?
6 réponses
Class
est une classe PARAMÉTRABLE, vous pouvez donc utiliser la syntaxe Class<T>
Où T est un type. En écrivant Class<?>
, vous déclarez un objet Class
qui peut être de n'importe quel type (?
est un caractère générique). Le type Class
est un type qui contient des méta-informations sur une classe.
C'est toujours une bonne pratique de se référer à un type générique en spécifiant son type spécifique, en utilisant Class<?>
vous respectez cette pratique (vous savez que Class
est paramétrable) mais vous ne limitez pas votre paramètre à avoir un type spécifique.
Référence sur les Génériques et des caractères génériques: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
Référence sur l'objet de classe et la réflexion (la fonctionnalité du langage Java utilisée pour s'introspecter): http://java.sun.com/developer/technicalArticles/ALT/Reflection/
Ce <?>
est une bête. Cela conduit souvent à la confusion et aux erreurs, car, quand vous le voyez en premier, vous commencez à croire que <?>
est un caractère générique pour tout type java. Qui est .. pas vrai. <?>
est le type inconnu, une légère et méchante différence.
, Il n'est pas un problème lorsque vous l'utilisez avec Class
. Les deux lignes fonctionnent et compilent:
Class anyType = String.class;
Class <?> theUnknownType = String.class;
Mais - si nous commençons à l'utiliser avec des collections, alors nous voyons d'étranges erreurs compiletime:
List<?> list = new ArrayList<Object>(); // ArrayList<?> is not allowed
list.add("a String"); // doesn't compile ...
Notre List<?>
n'est pas une collection, qui convient à n'importe quel type d'objet. Il ne peut stocker qu'un seul type: le mystique "type inconnu". Ce qui n'est pas un vrai type, c'est sûr.
Il est un génériques littérale. Cela signifie que vous ne connaissez pas le type de classe que représente cette instance Class
, mais vous utilisez toujours la version générique.
- Si vous connaissiez la classe, vous utiliseriez
Class<Foo>
. De cette façon, vous pouvez créer une nouvelle instance, par exemple, sans lancer:Foo foo = clazz.newInstance();
- Si vous n'utilisez pas de génériques du tout, vous recevrez au moins un avertissement (et ne pas utiliser de génériques est généralement déconseillé car cela peut entraîner des effets secondaires difficiles à détecter)
Cela signifie que votre référence de classe peut contenir une référence à n'importe quel objet de classe.
C'est fondamentalement la même chose que "Class" mais vous montrez aux autres personnes qui lisent votre code que vous n'avez pas oublié les génériques, vous voulez juste une référence qui peut contenir n'importe quel objet de classe.
Bruce Eckel, penser en Java:
En Java SE5, Classe> est préféré à la classe simple, même s'ils sont équivalents et la classe simple, comme vous l'avez vu, ne produit pas de avertissement du compilateur. Le avantage de la Classe> est qu'il indique que vous n'utilisez pas seulement une référence de classe non spécifique par accident, ou par ignorance. Vous avez choisi la version.
Cela signifie une classe avec un type de n'importe quoi (inconnu).
Vous devriez lire le tutoriel Java generics pour mieux le comprendre