Instanziieren generischen Typ in Java

8

Ich stecke fest. Von C ++ kommend dachte ich, das würde einfach funktionieren, aber das tut es nicht. Können Sie mir bitte einen Rat geben? Ich werde versuchen, in jeder Klasse, die für T verwendet wird, nicht mit einer Art Erstellungsmethode zu enden.

%Vor%

Ich möchte auch nicht, dass Konstruktoren wie folgt aussehen: A (Class classT) {... Idealerweise hätte ich gerne so etwas wie diesen C ++ Code.

%Vor%

Danke für die Hilfe.

    
nux 31.05.2012, 09:27
quelle

4 Antworten

7

Sie können solche Dinge nicht in Java tun. Lesen Sie über Typ löschen: Ссылка

    
popfalushi 31.05.2012, 09:29
quelle
11

Neben dem Problem des Löschens von Typen - was dies in jedem Fall unmöglich macht - können Sie einfach nicht garantieren, dass T einen exposed, no-argument-Konstruktor hat!

Die traditionelle Problemumgehung besteht darin, Factory-Objekte zu übergeben, die Methoden bereitstellen, mit denen T -Objekte abgerufen werden können. Ein einfaches Beispiel wäre

%Vor%

und dann kann Ihre Klasse ein Factory<T> erhalten und create() aufrufen, um mehr T s zu erhalten. Anspruchsvollere Beispiele erfordern unter Umständen zusätzliche Argumente für eine create -Methode oder Überladungen.

Zu den weniger schönen Problemumgehungen gehören die explizite Reflektion und das Umgehen von Class<T> -Objekten. Zum Beispiel gibt ArrayList.class.newInstance() eine neu erstellte rohe ArrayList zurück. Sie müssen das Class -Objekt explizit weitergeben, und der reflektionsbasierte Ansatz ist langsamer als ein normaler Konstruktor oder ein Factory-Objekt (auch wenn sich die Reflektionsgeschwindigkeit in letzter Zeit verbessert hat). Sie sind auch davon abhängig, dass die Klasse einen Nicht-Arg-Konstruktor ausstellt, was nicht immer der Fall ist. Es kann gemacht werden, um zu arbeiten, aber es ist nie, was ich "angenehm" nennen würde.

(Als Hinweis darauf gibt es Hinweise darauf, dass sich die Situation in Java 8 mit Project Lambda und Freunden etwas ändern könnte.)

    
Louis Wasserman 31.05.2012 09:30
quelle
5

Entschuldigen Sie die Enttäuschung, aber das ist einfach unmöglich in Java ohne Konstrukteure.

Java verwirft die generischen Informationen zur Laufzeit (siehe Typ löschen)

    
tgoossens 31.05.2012 09:30
quelle
0

versuche das:

%Vor%     
tagtraeumer 31.05.2012 09:34
quelle