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.
Sie können solche Dinge nicht in Java tun. Lesen Sie über Typ löschen: Ссылка
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
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.)
Tags und Links java generics object templates instantiation