Ma question est celle ci-dessus. Désolé, c'est probablement un doublon, mais je n'ai pas trouvé d'exemple avec le <?>
à la fin.
Pourquoi ne l'utiliseriez-vous pas uniquement Class
comme paramètre?
Ma question est celle ci-dessus. Désolé, c'est probablement un doublon, mais je n'ai pas trouvé d'exemple avec le <?>
à la fin.
Pourquoi ne l'utiliseriez-vous pas uniquement Class
comme paramètre?
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 Class
objet qui peut être de n'importe quel type ( ?
est un caractère générique). Le Class
type est un type qui contient des méta-informations sur une classe.
C'est toujours une bonne pratique de faire référence à un type générique en spécifiant son type spécifique, en utilisant Class<?>
vous respectez cette pratique (vous savez Class
qu'elle est paramétrable) mais vous ne limitez pas votre paramètre à un type spécifique.
Référence sur les génériques et les caractères génériques: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
Référence sur l' Class
objet et la réflexion (la fonctionnalité du langage Java utilisée pour s'introspecter): https://www.oracle.com/technetwork/articles/java/javareflection-1536171.html
Class
sans type? Ils semblent représenter la même chose.
?
caractère générique." . Si vous ne donnez pas le caractère générique, le compilateur suppose que vous avez oublié le type ou que vous ne saviez pas que la classe était générique et vous en avertira.
Class<?>
Class
ne peut tout simplement pas être passé à un argument dont le type est Class<?>
, donc Class<?>
est plus pratique pour toutes les situations.
C'est <?>
une bête. Cela conduit souvent à de la confusion et des erreurs, car, lorsque vous le voyez en premier, vous commencez à croire, <?>
c'est un caractère générique pour tout type Java . Ce qui n'est pas vrai. <?>
est le type inconnu , une légère et méchante différence.
Ce 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, nous voyons d'étranges erreurs de compilation:
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, bien sûr.
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 à d'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 Class.
Bruce Eckel, Penser à Java:
Dans Java SE5, la classe <?> Est préférée à la classe ordinaire, même si elles sont équivalentes et que la classe simple, comme vous l'avez vu, ne produit pas d'avertissement du compilateur. L'avantage de la classe <?> Est qu'elle indique que vous n'utilisez pas simplement une référence de classe non spécifique par accident ou par ignorance. Vous avez choisi la version non spécifique.
C'est un littéral générique . Cela signifie que vous ne connaissez pas le type de classe que cette Class
instance représente, mais que vous utilisez toujours la version générique.
Class<Foo>
. De cette façon, vous pouvez créer une nouvelle instance, par exemple, sans cast:Foo foo = clazz.newInstance();