在Java中创建泛型类型的实例?
是否有可能在Java中创建一个泛型类型的实例? 我正在考虑基于我所看到的答案是no
(由于类型擦除),但是如果有人能看到我失踪的东西,我会感兴趣:
class SomeContainer<E>
{
E createContents()
{
return what???
}
}
编辑:事实证明,超类型令牌可以用来解决我的问题,但它需要很多基于反射的代码,因为下面的答案已经指出。
我将暂时搁置一会儿,看看是否有人提出与伊恩罗伯逊的Artima Article截然不同的东西。
你是对的。 你不能做“新E”。 但你可以改变它
private static class SomeContainer<E>
{
E createContents(Class<E> clazz)
{
return clazz.newInstance();
}
}
这是一个痛苦。 但它的工作。 用工厂模式包装它使它更容易一些。
不知道,如果这有帮助,但是当你继承(包括匿名)泛型时,类型信息可以通过反射获得。 例如,
public abstract class Foo<E> {
public E instance;
public Foo() throws Exception {
instance = ((Class)((ParameterizedType)this.getClass().
getGenericSuperclass()).getActualTypeArguments()[0]).newInstance();
...
}
}
所以,当你将Foo子类化时,你会得到一个Bar的实例,例如,
// notice that this in anonymous subclass of Foo
assert( new Foo<Bar>() {}.instance instanceof Bar );
但是这是很多工作,只适用于子类。 可以很方便。
你需要某种形式的抽象工厂来传递:
interface Factory<E> {
E create();
}
class SomeContainer<E> {
private final Factory<E> factory;
SomeContainer(Factory<E> factory) {
this.factory = factory;
}
E createContents() {
return factory.create();
}
}
链接地址: http://www.djcxy.com/p/15185.html