Это может не всегда работать, так как, если у вас просто есть new Ext<String>()
в каком-либо методе, для этого типа нет данных об отражении.
Таким образом, Ext<String> ext = new Ext<String>(String.class);
потеряет информацию о типе во время выполнения (стирание типа), что приведет к Ext ext = new Ext(String.class);
.
Если у вас есть такие поля, как private Ext<String> stringExt
или конкретные подклассы, такие как StringExt extends Ext<String>
, у вас есть данные отражения, которые вы можете получить.
Вот небольшая статья с некоторым источником, который можно использовать для получения данных об отражении для конкретных подклассов (и, возможно, для полей, но я этого не проверял): http://www.artima.com/weblogs/viewpost.jsp?thread=208860
Как я уже сказал, мы используем скорректированную версию этого кода для получения параметров типа для конкретных подклассов.
Итак, у нас есть что-то вроде этого:
class AbstractDAO<T entityType> {
protected Class<?> entityClass;
protected AbstractDAO() {
//ReflectionUtil is our adjusted version of code in the link above
entityClass = ReflectionUtil.getTypeArguments(AbstractDAO.class, getClass() ).get(0);
}
}
//Here entityClass is User.class
class UserDAO extends AbstractDAO<User> { ... }