【问题标题】:Instantiating a Type Parameter Without Passing an Object在不传递对象的情况下实例化类型参数
【发布时间】:2014-05-01 17:16:40
【问题描述】:
我的问题与this 问题非常相似。我希望能够实例化类型参数类型的对象,但也不需要传入“工厂”。我真的需要被包含在一个班级中。
public class myClass<E> {
E someObject;
public myClass(){
someObject = new E();
}
}
以前的解决方案需要将 myClass 的构造函数更改为具有工厂参数,然后调用它的构造函数,但出于我的目的,我不想修改从外部对 myClass 的任何调用。
【问题讨论】:
标签:
java
oop
type-parameter
【解决方案1】:
问题是你不知道E 是什么,也不知道如何构造它。它可以是任何类型(它是universally quantified)。您需要提供证据证明,无论E 是什么,它都可以真正构建。给定类型的“工厂”可以证明它可以做到这一点。
想一想:如果我将Void 作为参数E 传递会怎样?您将如何构造一个 Void 类型的值?
能够为所有E构造E 就像从无到有创造一些东西。这是逻辑上的不可能。 ∀E. E 是一个无人居住的集合。
您真正想要的是让E 有一个界限,或者传递一个构造函数(工厂)作为E 在可构造对象集中这一事实的见证。
【解决方案2】:
不,如链接问题的答案中所述,您不能这样做。修改接口传入一个工厂对象。 (注意:Class 是一家糟糕的工厂。)
【解决方案3】:
您知道您的代码不起作用,并且您期望找到一个语法足够接近的解决方案。
这个怎么样?
//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){...}
}