我有以下抽象类:
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 - 但不知道如何做到这一点。有关最佳方法的任何帮助将不胜感激。
答案 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()
。
免责声明:未经测试,但我很确定我已经阅读了它可行的地方。