Was ist der Unterschied zwischen Class clazz und Class? clazz in Java?

8

Ich muss die Reflexion in Java nutzen. Ich verstehe, dass Class clazz eine Variable erstellt, die ein Objekt Class repräsentiert. Ich versuche jedoch, mit der Methode Class auf ein String -Objekt von einem forName("aClassName") zu verweisen. Meine IDE (Eclipse) scheint der Schreibweise Class<?> clazz vorzuziehen, um die Variable zu deklarieren. Ich habe diese Notation viele Male woanders gesehen. Was bedeutet das?

Bearbeiten: Der Verweis auf den ternären Operator wurde entfernt, da er für diese Frage nicht relevant ist.

    
Andrew Harasta 28.02.2013, 20:04
quelle

3 Antworten

22

Class ist ein roher Typ - es ist im Grunde genommen ein generischer Typ, den Sie behandeln, als ob Sie überhaupt nichts von Generika wussten.

Class<?> ist ein generischer Typ mit einem ungebundenen Platzhalter - es bedeutet im Grunde " Class<Foo> für einen Typ Foo , aber ich weiß nicht was".

Ähnlich können Sie Platzhalter mit Begrenzungen haben:

  • Class<? extends InputStream> bedeutet " Class<Foo> für einen Typ Foo , aber ich weiß nicht, wie lange es InputStream oder eine Unterklasse"

  • ist
  • Class<? super InputStream> bedeutet " Class<Foo> für einen Typ Foo , aber ich weiß nicht, wie lange es InputStream oder eine Oberklasse ist"

Siehe auch die Java-Generics-FAQ für ein Los Weitere Informationen:

Und die Java-Sprachspezifikation:

Insbesondere aus dem Abschnitt Rohtypen:

  

Rohtypen sind eng mit Platzhaltern verbunden. Beide basieren auf existentiellen Typen. Raw-Typen können als Platzhalter betrachtet werden, deren Typregeln absichtlich falsch sind, um die Interaktion mit Legacy-Code zu ermöglichen. In der Vergangenheit haben rohe Typen Wildcards vorangestellt. Sie wurden erstmals in GJ eingeführt und in dem Artikel "Die Zukunft für die Vergangenheit sichern" beschrieben: Gilad Bracha, Martin Odersky, David Stoutamire und Philip Wadler, in Proceedings der ACM-Konferenz über Object- Orientierte Programmierung, Systeme, Sprachen und Anwendungen (OOPSLA 98), Oktober 1998.

    
Jon Skeet 28.02.2013, 20:06
quelle
2

Das erste, was zu realisieren ist, dass in diesem Fall das "?" ist NICHT der ternäre Operator, sondern ist Teil der Java-Generika-Implementierung und zeigt an, dass der Typ der Klasse nicht spezifiziert ist, wie einige der anderen Antworten bereits erläutert haben.

Um die Frage nach dem ternären Operator zu klären, ist es eigentlich sehr einfach.

Stellen Sie sich vor, Sie hätten folgende if-Anweisung:

%Vor%

Sie können das mit dem ternären Operator (denken Sie an es als den if-else-shortcut-Operator) neu schreiben:

%Vor%

Es ist jedoch am besten, den ternären Operator für alle außer den einfachsten Anweisungen zu vermeiden, um die Lesbarkeit Ihres Codes zu verbessern.

    
yogaphil 28.02.2013 20:15
quelle
0

In generischen Typen bedeutet der Platzhalter ? "was auch immer Klasse" (also ist Class<?> dasselbe wie nur Class , aber als roher Typ korrekt parametrisiert).

    
Vinze 28.02.2013 20:08
quelle