Если GenericDaoImpl
является абстрактным, и вся реальная реализация имеет ограничения T
и K
, то вы можете получить значение параметров типа, используя отражение:
abstract class GenericDaoImpl<K, T> {
public T get(K id) {
Class<?> valueClazz = (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
return super.getHibernateTemplate().get(valueClazz, id);
}
}
class StringDao extends GenericDaoImpl<Integer, String> {
}
Я создал слегка измененный пример на ideone , но он просто печатает класс типов, в данном случае String.
Это работает только тогда, когда StringDao
(и все другие DAO)это прямой подкласс GenericDaoImpl
, поэтому он немного хрупкий.И, как я уже сказал, это НЕ будет работать, если GenericDaoImpl не является абстрактным, а предназначен для непосредственного использования.В этом случае я думаю, что вы должны подумать, является ли то, что вы делаете, правильным подходом.По моему опыту, DAO, которые являются такими общими, не очень хорошо работают.