52 Stimmen

Warum ist Java's Class<T> generisch?

Warum ist Javas Class<T> generisch?

34voto

Steve B. Punkte 52372

Damit generisch typisierte Methoden verwendet werden können -

Class<Foo> klass = Foo.class;
Foo f = klass.newInstance();
Foo f = klass.cast(Object);

0 Stimmen

Warnung an alle, die glauben, dass diese Antwort richtig ist, weil sie akzeptiert wurde: Sie kann nicht richtig sein, weil der Code nicht kompilierbar ist. klass nicht initialisiert wird, bevor es verwendet wird.

5 Stimmen

... (Nachbereitung): Beachten Sie, dass Code, der sich kompilieren lässt - nämlich, Class<Foo> klass = Foo.class; - wirft die ursprüngliche Frage auf, denn Foo.class liefert scheinbar bereits die notwendigen Informationen. Allerdings ist die Fähigkeit, generisch typisierte Methoden zu verwenden, die richtige Antwort; es ist nur nicht klar aus dem gegebenen Beispiel hier.

15voto

Chris Arguin Punkte 11608

Hier finden Sie eine recht gute Zusammenfassung der Vorteile: http://download.oracle.com/javase/tutorial/extra/generics/literals.html

14voto

Bill the Lizard Punkte 384619

Ein kurzer Hinweis darauf findet sich in der Generika in der Version 1.5 des Sprachführers:

Noch überraschender ist, dass die Klasse Class generiert wurde. 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 von Generika hätten Sie das Ergebnis an Author übergeben 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

8voto

Jérôme Verstrynge Punkte 54576

Der eigentliche Grund ist folgender Neil Gafter :

Als wir in JDK5 die Generika zu Java hinzugefügt haben, habe ich die Klasse java.lang.Class in einen generischen Typ umgewandelt. Zum Beispiel ist der Typ von String.class ist jetzt Class < String >. Gilad Bracha hat dafür den Begriff type Token für diesen Vorgang geprägt. Meine Absicht war es, eine bestimmte Art von API zu ermöglichen, die Joshua Bloch THC nennt, oder Typesafe Heterogenous Container Muster nennt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X