Определенно можно извлечь его из Class#getGenericSuperclass()
, потому что он не определен во время выполнения, но во время компиляции в FooDao extends BaseDao
.
Вот пример запуска, как вы могли бы извлечь желаемый общий супер тип в конструкторе абстрактного класса, принимая во внимание иерархию подклассов (вместе с реальным случаем использования приложения на основе EntityManager
без необходимости явно указывать тип):
public abstract class BaseDao {
@PersistenceContext
private EntityManager em;
private Class type;
@SuppressWarnings("unchecked") // For the cast on Class.
public BaseDao() {
Type type = getClass().getGenericSuperclass();
while (!(type instanceof ParameterizedType) || ((ParameterizedType) type).getRawType() != BaseDao.class) {
if (type instanceof ParameterizedType) {
type = ((Class>) ((ParameterizedType) type).getRawType()).getGenericSuperclass();
} else {
type = ((Class>) type).getGenericSuperclass();
}
}
this.type = (Class) ((ParameterizedType) type).getActualTypeArguments()[0];
}
public E find(Long id) {
return em.find(type, id);
}
public List list() {
return em.createQuery(String.format("SELECT e FROM %s e ORDER BY id", type.getSimpleName()), type).getResultList();
}
// ...
}