Ich habe eine Vorlagenklasse wie folgt:
class MyClass<T>
{
T field;
public void myMethod()
{
field = new T(); // gives compiler error
}
}
Wie erstelle ich eine neue Instanz von T in meiner Klasse?
java
generics
reflection
Mercurious
quelle
quelle
Supplier
befindet sich das? `MyClass (Class <? Erweitert T> impl)` muss deklarieren `löst NoSuchMethodException` aus, um kompiliert zu werden. Ihre Antwort ist leider nicht freundlich zu Java-Anfängern.java.util.function.Supplier
Ein anderer nicht reflektierender Ansatz ist die Verwendung eines hybriden Builder / Abstract Factory-Musters.
In Effective Java geht Joshua Bloch das Builder-Muster im Detail durch und befürwortet eine generische Builder-Oberfläche:
Concrete Builder können diese Schnittstelle implementieren, und externe Klassen können den Concrete Builder verwenden, um den Builder nach Bedarf zu konfigurieren. Der Builder kann als an MyClass übergeben werden
Builder<T>
.Mit diesem Muster können Sie neue Instanzen von abrufen
T
, auch wennT
Konstruktorparameter vorhanden sind oder eine zusätzliche Konfiguration erforderlich ist. Natürlich benötigen Sie eine Möglichkeit, den Builder an MyClass zu übergeben. Wenn Sie nichts an MyClass übergeben können, sind Builder und Abstract Factory nicht verfügbar.quelle
Dies ist möglicherweise schwerer als das, was Sie suchen, aber es wird auch funktionieren. Beachten Sie, dass es bei diesem Ansatz sinnvoller ist, die Factory bei der Erstellung in MyClass einzufügen, als sie bei jedem Aufruf an Ihre Methode zu übergeben.
quelle
Wenn Sie bereit sind, eine Unterklasse zu erstellen, können Sie auch das Löschen vermeiden. Weitere Informationen finden Sie unter http://www.artima.com/weblogs/viewpost.jsp?thread=208860
quelle
Klasse classOfT
quelle