类型参数不会到达运行时,因此调用代码必须传递一个令牌才能在运行时构造Class<T>
对象。我将其命名为令牌,因为您可以传递许多不同的对象来Class<T>
在运行时重建对象,例如:
- a
String
, 与Class.forName(name)
- 一个
Class<T>
对象
- 类型标记,即参数化类型的子类,其参数既不是类型变量也不是通配符(有界或无界),例如 a
new List<String>(){}
(我使用new
花括号来强调该表达式返回匿名子类的实例)
使用类型标记:
public class MyGenericDAO<T> {
@SuppressWarnings("unchecked")
public Class<T> getTypeParameter() throws Exception {
Type type = ((ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
return (Class<T>) type;
}
}
请注意,当您将 转换Type
为Class<T>
. 调用代码如下所示:
MyGenericDAO<Foo> dao = new MyGenericDAO<Foo>(){};
// Then if you want an instance
Foo foo = dao.getTypeParameter().newInstance();
再次注意花括号,因为超类型标记仅在编译时生成真实类时才有效。这种方法只有在客户端代码遵守合同并在每次需要 DAO 对象时使用匿名内部类时才有效(否则魔法getTypeParameter()
消失)