2008-11-14 2 views
8

J'ai un bloc de code qui fonctionne et je voulais demander ce qui se passe exactement ici?Java Class Type

Class<?> normalFormClass = null; 

--- --- ajouté

Le caractère générique "<?>" est la partie qui est source de confusion pour moi. Pourquoi cela serait-il utilisé plutôt que de ne pas l'utiliser (génériques)?

Répondre

12

Cela signifie qu'il peut s'agir d'une classe de tout type. ? est un joker désignant l'ensemble de tous les types, ou 'any'. Ainsi, vous pouvez faire plus tard

Integer normalForm = new Integer(); 
normalFormClass = normalForm.getClass(); 

ou

String normalForm = new String(); 
normalFormClass = normalForm.getClass(); 

Si vous n'êtes pas au courant des génériques sur Java, lisez http://java.sun.com/developer/technicalArticles/J2SE/generics/

Quant au pourquoi, je pense qu'il pourrait être d'exprimer strictement que vous êtes en utilisant des génériques partout et votre code n'est pas compatible avec les versions plus anciennes de Java, ou peut-être pour fermer certains IDE de déclenchement. Et oui,

Class foo 

et

Class<?> foo 

sont équivalentes.

+0

excellent exemple! J'apprends toujours les bases de Java et je me suis toujours posé des questions sur les lignes de code avec ces parenthèses. –

+0

Merci Oui ... Je suis au courant des génériques mais le? wildcard était la chose que je voulais m'assurer de bien comprendre. –

+0

Sauf que vous ne pouvez pas créer une nouvelle classe comme ça;) Peut-être normalFormClass = obj.getClass(); – erickson

0

Je doute que ce soit des devoirs, puisque je n'ai jamais été dans une classe qui parlait de réflexion.

Mais il s'agit d'une affectation nulle simple. Ça ne fait rien.

2

Classe ou Classe <?> Fonctionne aussi bien. Une raison pour utiliser ce dernier est de se débarrasser de quelques avertissements que l'ide ou le compilateur vous lancerait en utilisant le premier formulaire.

+0

Vous l'avez compris et cela a du sens –

4

En outre, la version générique

Class<?> normalClass = null; 

est à peu près équivalente à la version de type brute,

Class normalClass = null; 

la principale différence est que celle-ci sera compatible avec les versions de Java qui ne sont pas soutenir les génériques, comme Java 1.4.

+0

Et ainsi il peut être utilisé pour préciser que vous n'écrivez pas de code compatible 1.4, par exemple. –

+0

Merci beaucoup c'est plus clair –

3

Classe < T> signifie que depuis JDK 1.5, Class est généré par le type défini par la classe. Une façon de penser à cela est que Class est une usine pour créer des instances de son type.
Spécifiquement, une classe <T> crée des instances de type T à partir de la méthode Class.newInstance(). A partir de la version 1.5 de JDK, il est recommandé par Java Language Spec de ne pas utiliser de types bruts. Ainsi, il est fortement recommandé que lorsque vous traitez avec une instance de classe de type inconnu, vous devez vous référer à "Classe <? >" et pas seulement "Classe". Bien sûr, si vous connaissez réellement le type ou une limite, vous pourriez trouver quelques avantages à le spécifier.

0

La classe est une classe paramétrable, vous pouvez donc utiliser la syntaxe Class 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 de classe est un type qui contient des métainformations sur une classe. Il est toujours bon de se référer à un type générique en spécifiant son type spécifique, en utilisant Class que 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 à propos Génériques et Wildcards: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html

Référence sur les objets de classe et de réflexion (la fonction du langage Java utilisée pour s'introspecter): http://java.sun.com/developer/technicalArticles/ALT/Reflection/