オブジェクトを渡さずに型パラメーターをインスタンス化する
-
10-07-2019 - |
質問
私の質問は、これの質問と非常によく似ています。 typeパラメーターtypeのオブジェクトをインスタンス化できるようにしたいだけでなく、「factory」を渡す必要もありません。すべてを1つのクラスに含める必要があります。
public class myClass<E> {
E someObject;
public myClass(){
someObject = new E();
}
}
以前のソリューションでは、myClassのコンストラクターを変更してファクトリパラメーターを設定し、そのコンストラクターを呼び出す必要がありましたが、私の目的では、外部からmyClassの呼び出しを変更したくありません。
解決
問題は、 E
が何であるか、またその構築方法がわからないことです。どのタイプでも構いません(普遍的に定量化された)。 E
が何であれ、実際に構築できるという証拠を提供する必要があります。 「工場」与えられたタイプの証言は、それができるという事実の証人の役割を果たします。
これについて少し考えてみましょう: E
パラメータとして Void
を渡すとどうなりますか? Void型の値をどのように構築しますか?
すべての E
に対して E
を構築できるのは、何もないところから何かを作成するようなものです。それは論理的に不可能です。 <コード>∀E。 E は無人のセットです。
本当に必要なのは、 E
にバインドするか、 E
がセットに含まれていることの証人としてコンストラクター(工場)を渡すことです。構築可能なオブジェクトの。
他のヒント
いいえ、リンクされた質問への回答で説明されているように、それはできません。ファクトリオブジェクトを渡すようにインターフェイスを変更します。 (注: Class
は悪いファクトリになります。)
コードが機能しないことがわかっているので、十分に近い構文のソリューションを期待しています。
これはどうですか?
//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){...}
}