如何实例化Java参数类型

时间:2013-04-16 12:42:10

标签: java

我有以下抽象类:

public abstract class AbstractRepository<O, PK extends Serializable>{

protected EventDispatcher eventDispatcher;

protected GenericDao<O,PK> dao;

protected ApplicationPublisher publisher;

protected State state;

protected InternalPublisher internalPublisher;

@PostConstruct
private void initialise(){
    eventDispatcher.addHandler(this);
}

protected <T extends GenericDao<O,PK>> AbstractRepository(T dao, State state, ApplicationPublisher publisher, InternalPublisher internalPublisher, EventDispatcher eventDispatcher){
    this.dao = dao;
    this.state = state;
    this.publisher = publisher;
    this.internalPublisher = internalPublisher;
    this.eventDispatcher = eventDispatcher;
}


@HandleEvent
private void handleDataContributorCreatedEvent(DataContributorDeletedEvent event){

    List<O> stats = new ArrayList<O>();

    for(int x = -1 ; x < 50 ; x++){

        for (int y = 0 ; y < 360 ; y = y + 5){
            stats.add(**Need to instantiate paramater type O here**);
        }   

    }
    dao.save(stats);
}

}

在事件处理程序方法中 - 我希望能够创建参数类型的实例,O - 但不知道如何做到这一点。有关最佳方法的任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:0)

由于type erasure in Java,你不能这样做。基本上,没有办法在运行时知道O参数的类。

正如@pescis建议的那样,here被描述为克服这个问题的方法。

答案 1 :(得分:0)

实际上你可以得到静态类型变量的类型。请参阅this article

答案 2 :(得分:0)

您应该创建一个接受参数

的构造函数
Class<O> class

对象存储它以及何时需要它

class.getConstructor() and constructor.newInstance 

反射API的方法。这是因为泛型类型仅在编译时存在,在字节码中所有这些东西都只是普通的对象。

答案 3 :(得分:0)

您可以尝试使用您拥有的List实例,如下所示:

Class<?> clazz = (Class<?>) stats.getGenericInterface()[0];

然后你可以clazz.newInstance()

免责声明:未经测试,但我很确定我已经阅读了它可行的地方。