我的问题与this问题非常相似。我希望能够实例化类型参数类型的对象,但也无需传入“工厂”。我真的需要被收录在一个班级中。
public class myClass<E> {
E someObject;
public myClass(){
someObject = new E();
}
}
以前的解决方案需要将myClass的构造函数更改为具有工厂参数,然后调用它的构造函数,但出于我的目的,我不想从外部修改对myClass的任何调用。
答案 0 :(得分:7)
问题在于你不知道E
是什么,也不知道如何构建它。它可以是任何类型(它是universally quantified)。您需要提供证据,无论E
是什么,它都可以真正构建。某种类型的“工厂”可以作为一种见证它可以的事实。
想一想:如果我将Void
作为参数E
传递怎么办?您将如何构建Void类型的值?
能够为所有E
构建E
就像创造一些无中生有的东西。这在逻辑上是不可能的。 ∀E. E
是一个无人居住的集合。
你真正想要的是E
有一个绑定,或者传递一个构造函数(工厂)作为E
在可构造对象集中的事实的见证。
答案 1 :(得分:1)
不,正如链接问题的答案所解释的那样,你不能这样做。修改接口以传入工厂对象。 (注意:Class
制造了一个糟糕的工厂。)
答案 2 :(得分:0)
您知道您的代码不起作用,并且您期望一种语法足够接近的解决方案。
这个怎么样?
//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){...}
}