在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

上一篇: Create instance of generic type in Java?

下一篇: compiled code in JVM?