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?

100
demandé sur Bozho 2012-03-29 12:25:40

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/

82
répondu manub 2012-03-29 08:30:03

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.

51
répondu Andreas_D 2012-03-29 08:55:42

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)
6
répondu Bozho 2012-03-29 08:27:50

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.

6
répondu Filip 2016-02-29 07:08:26

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

4
répondu Jasonw 2012-03-29 08:30:17

Cela signifie une classe avec un type de n'importe quoi (inconnu).

Vous devriez lire le tutoriel Java generics pour mieux le comprendre

3
répondu fmucar 2016-09-21 17:56:56