Ma question est comme ci-dessus. Désolé, c'est probablement un doublon, mais je n'ai pas trouvé d'exemple avec le <?>
a la fin.
Pourquoi ne pas simplement utiliser Class
comme paramètre?
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 tout type (?
est un caractère générique). Le type Class
est un type contenant des méta-informations sur une classe.
Il est toujours recommandé 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 êtes conscient que Class
doit être paramétrable) mais vous ne limitez pas le 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 à propos de Class
objet et de la réflexion (caractéristique de Java utilisé pour l'introspection lui-même)): https://www.Oracle.com/technetwork/articles/ Java/javareflection-1536171.html
Cette <?>
est une bête. Cela conduit souvent à de la confusion et à des erreurs, car lorsque vous le voyez en premier, vous commencez à croire, <?>
est un caractère générique pour any Java type . Ce qui est .. pas vrai. <?>
est le type inconn, une différence légère et désagréable.
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 verrons alors des erreurs de compilation étranges:
List<?> list = new ArrayList<Object>(); // ArrayList<?> is not allowed
list.add("a String"); // doesn't compile ...
Notre List<?>
n'est pas une collection, elle convient à tout type d'objet. Il ne peut stocker qu'un type: le "type inconnu" mystique. Ce qui n'est pas un type réel, 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 "Classe", mais vous montrez aux autres lecteurs de votre code que vous n'avez pas oublié les génériques, vous voulez juste une référence pouvant contenir n'importe quel objet de classe.
Bruce Eckel, penser en Java:
Dans Java SE5, la classe <?> Est préférée à la classe simple, 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 < ?> indique-t-il que vous n'utilisez pas 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 génériques littéral. Cela signifie que vous ne connaissez pas le type de classe que cette instance Class
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 transtyper: Foo foo = clazz.newInstance();
Dans les génériques, un type inconnu est représenté par le caractère générique "?". Lire ici pour exemple officiel.
Cela signifie une classe avec un type de rien (inconnu).
Vous devriez lire le tutoriel Java sur les génériques pour mieux le comprendre)