Es gibt eine gute Diskussion über Generics und was sie wirklich hinter den Kulissen tun bei [diese Frage] (https://stackoverflow.com/questions/31693/differences-in-generics), so dass wir alle wissen, dass Vector<int[]>
ein Vektor von Integer-Arrays ist, und HashTable<String, Person>
eine Tabelle ist, deren Schlüssel Strings und Werte Person
s sind.
Was mich jedoch stutzig macht, ist die Verwendung von Class<>
.
Die Java-Klasse Class
soll auch einen Vorlagennamen annehmen, (oder so wird es mir durch die gelbe Unterstreichung in Eclipse gesagt). Ich verstehe nicht, was ich dort hineinschreiben soll. Der ganze Sinn des Class
-Objekts ist, wenn man nicht alle Informationen über ein Objekt hat, für Reflektion und so. Warum muss ich angeben, welche Klasse das "Class"-Objekt enthalten soll? Ich weiß es offensichtlich nicht, sonst würde ich nicht das Class
-Objekt verwenden, sondern das spezifische.
Die Verwendung der generierten Version der Klasse Class ermöglicht es Ihnen unter anderem, Dinge zu schreiben wie
Class<? extends Collection> someCollectionClass = someMethod();
zu schreiben, und dann können Sie sicher sein, dass das Class-Objekt, das Sie erhalten, Collection
erweitert, und eine Instanz dieser Klasse wird (mindestens) eine Collection sein.
Aus der Java-Dokumentation:
[...] Noch überraschender ist, dass die Klasse Class generiert worden ist. Klassenliterale fungieren nun als Typ-Token, die sowohl zur Laufzeit als auch zur Kompilierzeit Typinformationen liefern. Dies ermöglicht eine Art von statischen Fabriken, die durch die getAnnotation-Methode in der neuen AnnotatedElement-Schnittstelle veranschaulicht wird:
<T extends Annotation> T getAnnotation(Class<T> annotationType);
Dies ist eine generische Methode. Sie leitet den Wert ihres Typparameters T aus ihrem Argument ab und gibt eine entsprechende Instanz von T zurück, wie der folgende Ausschnitt zeigt:
Author a = Othello.class.getAnnotation(Author.class);
Vor der Einführung der Generika hätte man das Ergebnis in Author umwandeln müssen. Außerdem hätte man keine Möglichkeit gehabt, den Compiler überprüfen zu lassen, ob der aktuelle Parameter eine Unterklasse von Annotation darstellt. [...]
Nun, ich musste diese Art von Dingen nie verwenden. Kennt das jemand?
Oft möchte man Wildcards mit Class
verwenden. Zum Beispiel, Class<? extends JComponent>
, würde es Ihnen erlauben, anzugeben, dass die Klasse eine Unterklasse von JComponent
ist. Wenn Sie die Class
-Instanz von Class.forName
abgerufen haben, können Sie Class.asSubclass
verwenden, um den Cast durchzuführen, bevor Sie versuchen, eine Instanz zu erstellen.