web-dev-qa-db-fra.com

Que signifie classe <?> En Java?

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?

119
david99world

Class est une classe paramétrable, vous pouvez donc utiliser la syntaxe Class<T>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

94
manub

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.

58
Andreas_D

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?.

6
Filip

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.

  • si vous connaissiez la classe, vous utiliseriez Class<Foo>. De cette façon, vous pouvez créer une nouvelle instance, par exemple, sans transtyper: Foo foo = clazz.newInstance();
  • si vous n'utilisez pas du tout de génériques, vous recevrez au moins un avertissement (et le fait de ne pas utiliser de génériques est généralement déconseillé car cela peut entraîner des effets secondaires difficiles à détecter)
5
Bozho

Dans les génériques, un type inconnu est représenté par le caractère générique "?". Lire ici pour exemple officiel.

4
Jasonw

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)

3
fmucar