В поисках ответа на интересную ситуацию, с которой я недавно столкнулся, я столкнулся со следующим вопросом: Тип безопасности, генерические файлы 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();
}
Спасибо!