Instanziieren ein Typ Parameter, ohne ein Objekt Passing
-
10-07-2019 - |
Frage
Meine Frage ist sehr ähnlich href="https://stackoverflow.com/questions/299998/instantiating-object-of-type-parameter"> diese Frage Bisherige Lösungen erforderlich, um den Konstruktor von myClass geändert werden, um eine Fabrik Parameter zu haben, und dann den Konstruktor davon zu nennen, aber für meine Zwecke Ich mag keine Anrufe myClass von außen ändern. public class myClass<E> {
E someObject;
public myClass(){
someObject = new E();
}
}
Lösung
Das Problem ist, dass Sie nicht wissen, was E
ist, noch wie es zu konstruieren. Es könnte jede Art sein (es ist allquantifizierte ). Sie müssen Beweise liefern, dass, was auch immer E
ist, kann es wirklich gebaut werden. Eine „Fabrik“ eines bestimmten Typs dient als eine Art Zeugnis für die Tatsache, dass es kann.
über das Denken für eine zweite: Was passiert, wenn ich Void
als Parameter E
passieren? Wie würden Sie gehen über einen Wert vom Typ Void konstruieren?
Die Möglichkeit, E
für alle E
zu konstruieren würde wie etwas aus dem Nichts zu schaffen sein. Es ist eine logische Unmöglichkeit. ∀E. E
ist ein unbewohnter Satz.
Was Sie wirklich wollen, ist entweder für E
ein gebundenes zu haben oder einen Konstruktor (Fabrik) als Zeuge der Tatsache zu, daß E
in dem Satz von konstruierbaren Objekten ist.
Andere Tipps
Nein, wie in den Antworten auf die verknüpfte Frage erklärt, Sie können das nicht tun. Ändern Sie die Schnittstelle in einem Factory-Objekt zu übergeben. (NB:. Class
macht ein schlechtes Werk)
Sie wissen, dass Ihr Code nicht funktioniert, und Sie werden eine Lösung mit einer nahe genug Syntax erwartet.
Wie wäre das?
//doesn't work. cannot make x.someObject a new String()
//MyClass<String> x = new MyClass<String>();
//this can work...
MyClass<String> x = MyClass.neu(String.class);
public class MyClass<E>
{
static public <T> MyClass<T> neu(Class<T> clazz){...}
}