1

我有以下抽象类:

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

3 回答 3

0

您应该创建一个接受参数的构造函数

Class<O> class

对象存储它,当你需要它时使用

class.getConstructor() and constructor.newInstance 

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

于 2013-04-16T12:55:22.863 回答
0

由于Java中的类型擦除,您不能这样做。O基本上,在运行时无法知道参数的类。

正如@pescis 所建议的,这里描述了克服这个问题的方法。

于 2013-04-16T12:45:03.747 回答
0

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

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

那么你可以clazz.newInstance()

免责声明:未经测试,但我很确定我在某处读过它有效。

于 2013-04-16T13:02:56.823 回答