Erstellen einer generischen Instanz des Typs in Java [duplizieren]

8

Ich habe die folgende Java-Klasse

%Vor%

Ich implementiere die folgende Methode:

%Vor%

Wie kann ich eine Instanz des Typs 'T' für diese Klasse erstellen?

Ich habe versucht, die T-Typ-Klasse zu definieren und "myInstance.newInstance ()" zu verwenden, aber ich konnte sie nicht definieren. Die Klasse als Parameter an die Methode zu senden und die Methode "newInstance ()" zu verwenden, funktioniert, aber ich möchte dies tun können, ohne sie als Parameter übergeben zu müssen. Danke!

    
Omri 29.08.2012, 11:58
quelle

4 Antworten

25

Java-Generics werden durch Löschen implementiert, was bedeutet, dass es zur Laufzeit keine Parametertyp-Informationen geben wird. Sie werden die T-Klasse zur Laufzeit nicht kennen (es gibt keine solche T.class). Sie müssen also das Objekt Class als Methodenparameter übergeben, um das zu tun, was Sie wollen.

    
dcernahoschi 29.08.2012, 12:03
quelle
10

Sie verlieren alle Informationen über den Typ, wenn Sie das Objekt in die generische Klasse / Funktion übergeben.

Sie können dies nur tun - übergeben Sie Class object an den Konstruktor \ function:

%Vor%     
Dmitry Zaytsev 29.08.2012 12:01
quelle
1

Leider können Sie aufgrund der Art des Löschens nicht tun, was Sie wollen.

Sie müssen Ihrer Klasse explizit mitteilen, welchen Typ sie instanziieren muss, indem Sie ihr Class oder, vielleicht eleganter, eine Factory zum Erstellen von Instanzen geben.

    
ᴇʟᴇvᴀтᴇ 29.08.2012 12:05
quelle
1

Es ist möglich, die Klasse zu extrahieren, an die T in einer bestimmten Unterklasse gebunden war, obwohl das nicht sehr einfach ist:

Ссылка

Ich habe eine etwas bessere Version des Codes in diesem Beitrag hier:

Ссылка

Ссылка

Dieser Ansatz ist auch nicht sehr schnell. Wenn Leistung ein Problem darstellt, könnte eine rauere Alternative sein, T und eine Instanz der Klasse & lt; T & gt; auch dort, wo du brauchst.

Natürlich müssen Sie, nachdem Sie eine solche Klasse haben, Reflektion verwenden, um sie zu instanziieren.

    
zakmck 29.08.2012 12:46
quelle