Кажется, я что-то упустил в Java Generics, потому что что-то, на мой взгляд, простое, мне кажется, что это невозможно. Может быть, вы можете помочь ...
Это сценарий: я кодирую общий абстрактный DAO с простой операцией CRUD, чтобы каждый конкретный DAO моего приложения мог иметь его бесплатно:
public abstract DefaultDAO<T,V> {
private EntityManager manager;
public BaseDAO(EntityManager em) {
this.manager = em;
}
public void create(T entity) {
manager.persist(entity);
}
// You know the others...
public T read(V pk) {
// Now, here is the problem.
// EntityManager signature is: public <T> T find(Class<T> entityClass, Object primaryKey);
// So I must provide the type of the object this method will be returning and
// the primary key.
// resulting object will be T typed and pk type is V type (although is not needed to type it since the method expects an Object)
// So... I expected to be allowed to do something like this
return manager.find(T, pk); // But it's not allowed to use T here. T is not an instance
}
}
Теперь я бы пошел и внедрил конкретный DAO:
public PersonDAO extends DefaultDAO<PersonEntity, Long> {
public PersonDAO(EntityManager em) {
super(em);
}
// CRUD methods are inherited
}
И код клиента для моего DAO будет:
EntityManager manager = ...
PersonDAO dao = new PersonDAO(manager);
Long pk = .....
PersonEntity person = dao.find(pk); // DAO would return a PersonEntity
Когда клиент выполняет код, BaseDAO знает тип сущности, которую он должен вернуть, и тип первичного ключа этой сущности, потому что я установил его для определенного dao, но я не знаю, как кодировать метод read () правильно.
Надеюсь, вы сможете помочь. Большое спасибо!