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.
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"
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.
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.
Tags und Links java reflection ternary-operator