2008-11-14 13 views
8

Ich habe einen Block Code, der funktioniert und ich wollte fragen, was genau hier passiert?Java Klasse Typ

Class<?> normalFormClass = null; 

--- --- hinzugefügt

Der Platzhalter "<?>" ist der Teil, der für mich ist verwirrend. Warum sollte das verwendet werden, anstatt es nicht zu verwenden (Generika)?

Antwort

12

Das bedeutet, es kann eine Klasse von jedem Typ sein. ? ist ein Platzhalter, der die Menge aller Typen oder "any" bezeichnet. So können Sie später tun

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

oder

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

Wenn Sie nicht wissen von Generika auf Java sind, lesen Sie http://java.sun.com/developer/technicalArticles/J2SE/generics/

Was das Warum, ich denke, es könnte zu streng, dass auszudrücken Sie sind mit Generika überall und Ihr Code ist nicht kompatibel mit älteren Java-Versionen, oder vielleicht die Klappe halten einige glückliche IDEs. Und ja,

Class foo 

und

Class<?> foo 

sind gleichwertig.

+0

gutes Beispiel! Ich lerne immer noch die Grundlagen von Java und habe mich immer über Codezeilen mit diesen Klammern gewundert. –

+0

Danke Ja ... ich kenne Generika aber die? Wildcard war die Sache, die ich sicherstellen wollte, dass ich sie vollständig verstand. –

+0

Außer Sie können keine neue Klasse wie diese erstellen;) Vielleicht normalFormClass = obj.getClass(); – erickson

0

Ich bezweifle, dass dies Hausaufgaben sind, da ich noch nie in einer Klasse war, die über Reflexion gesprochen hat.

Aber das ist eine einfache Null-Zuweisung. Es tut nichts.

2

Klasse oder Klasse <?> Funktioniert genauso gut. Ein Grund, Letzteres zu verwenden, besteht darin, einige Warnungen loszuwerden, die die ID oder der Compiler auf Sie werfen würde, wenn Sie das erste Formular verwenden.

+0

Bekam es und es macht Sinn –

4

Auch die generische Version

Class<?> normalClass = null; 

ziemlich gleichbedeutend mit der rohen Typ-Version ist,

Class normalClass = null; 

der Hauptunterschied ist, dass letztere mit Java-Versionen kompatibel sein wird, die nicht zu tun unterstützen Generika wie Java 1.4.

+0

Und so kann es verwendet werden, um deutlich zu machen, dass Sie nicht 1.4 kompatiblen Code schreiben, zum Beispiel. –

+0

Danke das ist viel klarer –

3

Klasse <T> bedeutet, dass Klasse seit JDK 1.5 durch den Typ definiert wird, den die Klasse definiert. Eine Möglichkeit, darüber nachzudenken, ist, dass Class eine Factory zum Erstellen von Instanzen seines Typs ist.
Insbesondere eine Klasse <T> erstellt Instanzen des Typs T von der Methode Class.newInstance().

Ab JDK 1.5 wird von der Java-Sprachspezifikation empfohlen, keine Raw-Typen zu verwenden. Es wird daher dringend empfohlen, dass Sie sich im Umgang mit einer Klasseninstanz unbekannten Typs als "Klasse <? >" und nicht nur als "Klasse" bezeichnen. Wenn Sie den Typ oder eine Grenze kennen, können Sie natürlich einige Vorteile feststellen.

0

Klasse ist eine parametrisierbare Klasse, daher können Sie die Syntax Class verwenden, wobei T ein Typ ist. Wenn Sie Class schreiben, deklarieren Sie ein Class-Objekt, das von jedem Typ sein kann (? Ist ein Platzhalter). Der Klassentyp ist ein Typ, der Metainformationen zu einer Klasse enthält.

Es ist immer gut, sich auf einen generischen Typ zu beziehen, indem Sie seinen spezifischen Typ angeben, indem Sie die Klasse verwenden, die Sie beachten (Sie kennen die zu parametrierende Klasse), aber Sie beschränken Ihre Parameter nicht darauf ein bestimmter Typ

Referenz über Generics und Wildcards: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html

Referenz über Klassenobjekt und Reflexion (das Merkmal der Java-Sprache verwendet, sich selbst zu überwachen): http://java.sun.com/developer/technicalArticles/ALT/Reflection/