2015-09-18 3 views
0

Что я делаю неправильно в этом классе Java? Поле clazz всегда равно null. Не следует ли автоматически заполнять clazz типом, определенным на конкретном классе?Параметрированный класс в Java

Спасибо!

public abstract class AbstractDAO<E extends Domain, T extends Number> { 

    protected EntityManager em; 
    private Class<E> clazz; 

    public AbstractDAO(final EntityManager em) { 
     this.em = em; 
    } 

    public E find(T id) { 
     return em.find(clazz, id); 
    } 

    public List<E> findAll() { 
     CriteriaBuilder cb = em.getCriteriaBuilder(); 
     CriteriaQuery<E> cq = cb.createQuery(clazz); 
     Root<E> from = cq.from(clazz); 
     CriteriaQuery<E> select = cq.select(from); 
     return em.createQuery(select).getResultList(); 
    } 

    // other methods 
} 
+0

Вы должны задать этот вопрос: http://stackoverflow.com/questions/18707582/get-actual-type-of-generic-type-argument-on-abstract-superclass/ – BalusC

+0

Упс. Прости. Спасибо, кстати. –

+0

было бы неплохо :) или если мы могли бы сделать «E.class» ... к сожалению, мы не можем сделать это в java. – ZhongYu

ответ

2

Нет, ничего в Java автоматически не заполняет Class<T> поле в обобщенном классе. Если ваш общий класс должен знать тип одного из параметров типа, вы должны добавить аргумент конструктора типа Class<T> и инициализировать его оттуда. См., Например, класс EnumMap в JDK.

+0

То, что я подразумевал под автозаполнением, было выведено из конкретного класса. Проблема решена с помощью части этого: http://stackoverflow.com/a/18709327/1831948 Спасибо! –

Смежные вопросы