2013-04-16 3 views
1

Я следующий абстрактный класс:Как Инстанцировать тип параметра 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 - но не знаю, как это сделать. Любая помощь в отношении наилучшего подхода будет оценена по достоинству.

+1

См. Http://stackoverflow.com/questions/1090458/instantiating-a-generic-class-in-java – ddmps

ответ

0

Вы не можете этого сделать из-за type erasure in Java. В принципе, нет способа узнать класс вашего параметра O во время выполнения.

Как предложено @pescis, here описаны способы преодоления этой проблемы.

0

Фактически вы можете получить тип статически типизированных переменных. См. this article.

0

Вы должны создать конструктор принимающий параметр,

Class<O> class 

объект хранить его и, когда вам это нужно использовать

class.getConstructor() and constructor.newInstance 

методы отражения API. Это связано с тем, что общие типы существуют только во время компиляции, в байт-коде все это просто простые объекты.

0

Вы можете попробовать использовать экземпляр списка у вас есть, что-то вроде этого:

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

, то вы можете clazz.newInstance().

Отказ от ответственности: не проверено, но я уверен, что где-то читал, что он работает.