Warum ist Java Class<T>
generisch?Warum ist Javas Klasse <T> generisch?
Antwort
Damit die allgemeinen typisierte Methoden verwendet werden können -
Class<Foo> klass = Foo.class;
Foo f = klass.newInstance();
Foo f = klass.cast(Object);
Hier ist eine ziemlich gute Zusammenfassung der Vorteile: http://download.oracle.com/javase/tutorial/extra/generics/literals.html
Es gibt eine kurze Erwähnung dieses im Generics Abschnitt der Version 1.5 des Sprachführers:
Noch überraschender, Klassenklasse wurde generisch. Klassenliterale fungieren jetzt als Typtoken, die Informationen sowohl zur Laufzeit als auch zur Kompilierzeit bereitstellen. Dies ermöglicht eine Art von statischen Fabriken durch die getAnnotation Methode beispielhaft in der neuen AnnotatedElement Schnittstelle:
<T extends Annotation> T getAnnotation(Class<T> annotationType);
Dies ist eine generische Methode. Es folgert den Wert seines Typparameter T von seinem Argument und gibt eine entsprechende Instanz von T, wie sie in der folgenden Ausschnitt dargestellt:
Author a = Othello.class.getAnnotation(Author.class);
Vor Generika, würden Sie die gehabt haben zu werfen Ergebnis für den Autor. Auch würden Sie keine Möglichkeit gehabt haben, den Compiler zu prüfen, ob der tatsächliche Parameter repräsentiert eine Unterklasse von Annotation
Der wahre Grund ist gegeben durch Neil Gafter zu machen:
Wenn wir hinzugefügt Generika Java in JDK5, Ich änderte die Klasse java.lang.Class zu einem generischen Typ. Zum Beispiel ist der Typ String.class jetzt < String>. Gilad Bracha prägte dafür die Bezeichnung Token. Meine Absicht war es, einen bestimmten API-Stil zu aktivieren, den Joshua Bloch das THC- oder TypeSafe Heterogene Container-Muster nennt.
- 1. Warum ist Array.newInstance (Klasse <?>, int) nicht generisch?
- 2. Warum ist java.util.Map.get (...) nicht generisch?
- 3. Warum ist List.toArray() nicht generisch?
- 4. Warum ist mein APK-Name generisch?
- 5. Warum ist die TaskFactory.StartNew-Methode nicht generisch?
- 6. Warum ist Code nicht ausreichend generisch?
- 7. Wie benutze ich CMake Generator Ausdruck $ <TARGET_FILE: tgt>?
- 8. Typ Mongo.Cursor ist nicht generisch
- 9. Drain-Methode in Javas Clip-Klasse
- 10. C# Öffne generischen Vergleich. Generisch <> ist "übergeordnet" von Generic <T>?
- 11. Warum ist die Deklaration in Javas Try-with-resource erforderlich?
- 12. Warum ist die Methodenklasse von Java nicht generisch?
- 13. Warum ist der NIO.2 FileVisitor-Typ generisch?
- 14. Warum ist die Klasse einer generischen Klasse <T> unsicher?
- 15. Was bedeutet * in javas Hauptargelliste?
- 16. Javas instanceof ungerades Verhalten
- 17. Javas Methoden vs. Funktionen
- 18. Kann ich einen Konstruktor generisch machen, ohne die Klasse generisch zu machen?
- 19. Javas Bigdecimal.divide und Rundung
- 20. Warum ist "[Selbst Klasse] == [Super Klasse]"?
- 21. Warum erbt IDictionary (nicht-generisch) nicht von IEnumerable <DictionaryEntry>?
- 22. Javas varargs Leistung
- 23. Wann ist eine generische Funktion nicht generisch?
- 24. Überprüfen Sie, ob der Typ generisch ist
- 25. String ist ein Klasse-warum
- 26. Warum ist String eine Klasse?
- 27. Warum ist Prädikat <> versiegelt?
- 28. iOS: Serialisieren/Deserialisieren komplexer JSON generisch von NSObject-Klasse
- 29. Javas Design by Contract Pattern
- 30. Javas Calendar.DAY_OF_WEEK_IN_MONTH max Wert ist 6. Ist das korrekt?
Warnung an alle, die glauben, dass diese Antwort korrekt ist, weil sie akzeptiert wurde: Dies kann nicht korrekt sein, da der Code nicht kompiliert wird. 'klass' ist nicht initialisiert bevor es benutzt wird. –
... (Folge): Beachten Sie, dass Code, der kompiliert - nämlich "Klasse klass = Foo.class;" - die ursprüngliche Frage stellt, weil "Foo.class" scheinbar die notwendigen Informationen bereits liefert. Die Möglichkeit, typisierte generische Methoden zu verwenden, ist jedoch die richtige Antwort. es ist einfach nicht klar aus dem gegebenen Beispiel hier. –