2009-05-26 6 views
9

Gibt es eine Möglichkeit, den generischen Parametertyp auf dem Bau an einen Parameter übergeben zu speichern. Mein Ziel:Shop Klasse Generika in Feld in Java

class generic<T> { 
    Class<T> type; 
    public generic() { 
     super(); 
     this.type = //Something that gets class from T 
    } 
} 

Was ich zur Zeit mache, ist dies:

class generic<T> { 
    Class<T> type; 
    public generic(Class<T> type) { 
     super(); 
     this.type = type; 
    } 
} 

Es scheint, albern die Klasse zweimal zu müssen angeben, aber ich bin nicht sicher, wie ich es anders zu tun. Ich denke, dies könnte mit Nachdenken möglich sein, aber ich habe das noch nicht untersucht. Gibt es einen direkteren Weg? Wenn nicht (nebenbei) warum der Informationsverlust?

+0

Wenn Sie mit Generika, warum Sie wollen/müssen die Klasse? Das hat einen seltsamen Geruch. – Instantsoup

+0

Einverstanden, Sie sollten zur Laufzeit nicht auf den generischen Parameter zugreifen müssen, da Generika nur eine Kompilierfunktion sind ... –

Antwort

10

Da Java-Generika mit Type Erasure

implementiert werden, wenn ein generischer Typ instanziert wird, der Compiler übersetzt diese Typen von eine Technik Typ Löschung genannt - ein Prozess, in dem der Compiler alle Informationen im Zusammenhang entfernt Geben Sie die Parameter ein und geben Sie Argumente innerhalb einer Klasse oder Methode ein. Typ Löschung ermöglicht Java Anwendungen, die Generika halten binäre Kompatibilität mit Java-Bibliotheken und Anwendungen verwenden, die vor Generika erstellt wurden.

3

Der Typ wird zur Laufzeit nicht beibehalten, daher können Sie ihn nicht als Parameter verwenden. Generics in Java sind streng genommen ein Compile-Time-Konzept (aus Gründen der Rückwärtskompatibilität). Dies wird Type Erasure genannt.

Einer der Gründe, die Klasse Objekt nimmt ein Typparameter genau um dieses Problem zu umgehen ist, so können Sie das Klassenobjekt nimmt den Typen programmatisch zu vertreten.

8

Wenn Sie eine statische Erstellungsmethode mit Typinferenz anstelle des Konstruktor verwenden, wird der Typ nicht zweimal angegeben werden.

Natürlich, wenn Sie das Ergebnis in einer Variablen speichern möchten, werden Sie wahrscheinlich den Typ trotzdem wiederholen!