В поисках ответа на интересную ситуацию, с которой я недавно столкнулся, я столкнулся со следующим вопросом: Тип безопасности, генерические файлы Java и запросы
Я написал следующий класс (очищенный бит)
public abstract class BaseDaoImpl<T extends Serializable> extends HibernateDaoSupport implements BaseDao<T> {
/**
* Finds and Returns a list of persistent objects by a collection of criterions
* @param criterions
* @return list of persistent objects
* @throws DBException
*/
@SuppressWarnings("unchecked")
protected List<T> findByCriteria(Collection<Criterion> criterions) throws DBException {
try {
DetachedCriteria criteria = DetachedCriteria.forClass(T.class); // BAD!!!
for (Criterion criterion : criterions) {
criteria.add(criterion);
}
List<T> result = getHibernateTemplate().findByCriteria(criteria);
return result;
}
catch (Exception e) {
throw new DBException(T.class + " lookup by " + criterions + " failed", e); // BAD!!!
}
}
}
Для некоторых (возможно, веских причин) T.class вызывает ошибку времени компиляции.
Мой первый вопрос: почему?
Если я изменил его на T.getClass(), который, очевидно, не должен компилироваться, потому что no 'T', когда "расширен" или проходит через "erasure", должен иметь статический метод, такой как. Eclipse IDE предоставляет следующее компиляционное сообщение:
Невозможно сделать статическую ссылку на нестатический метод getClass() из Тип объекта
Мой второй вопрос - почему? И что означает эта ошибка?
Наконец, было бы наиболее оптимальным решение для этого, как указано выше в ссылке (точнее, моей интерпретации)?
public abstract class BaseDaoImpl<T extends Serializable> extends HibernateDaoSupport implements BaseDao<T>, MyGenericHelper<T> {
/**
* Finds and Returns a list of persistent objects by a collection of criterions
* @param criterions
* @return list of persistent objects
* @throws DBException
*/
@SuppressWarnings("unchecked")
protected List<T> findByCriteria(Collection<MyCriterion> criterions) throws DBException {
try {
DetachedCriteria criteria = DetachedCriteria.forClass(getGenericClass()); // BAD!!!
for (Criterion criterion : criterions) {
criteria.add(criterion);
}
List<T> result = getHibernateTemplate().findByCriteria(criteria);
return result;
}
catch (Exception e) {
throw new DBException(getGenericClass() + " lookup by " + criterions + " failed", e); // BAD!!!
}
}
}
public interface MyGenericHelper<T extends Serializable> {
public Class<T> getGenericClass();
}
Спасибо!