在不传递对象的情况下实例化类型参数

时间:2009-11-30 19:43:29

标签: java oop type-parameter

我的问题与this问题非常相似。我希望能够实例化类型参数类型的对象,但也无需传入“工厂”。我真的需要被收录在一个班级中。

public class myClass<E> {
    E someObject;

    public myClass(){
         someObject = new E();
    }
}

以前的解决方案需要将myClass的构造函数更改为具有工厂参数,然后调用它的构造函数,但出于我的目的,我不想从外部修改对myClass的任何调用。

3 个答案:

答案 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){...}
}