请按照代码段
进行操作public class A<T> {
private T genericInstance() {
T target = null;
try {
Class<T> clazz = getGenericClass();
target = clazz.newInstance();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return target;
}
@SuppressWarnings("unchecked")
private Class<T> getGenericClass() {
ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
Type[] types = type.getActualTypeArguments();
return (Class<T>) types[0];
}
}
当我执行代码getGenericClass()
时,它返回Generic Super类,但我的要求是获取T
类,并希望动态实例化它。
答案 0 :(得分:3)
由于类型擦除,您需要T
的实例(或传递class
)。 Java泛型仅提供编译时类型检查,在运行时,泛型类型为Object
。在实践中,这并不困难,因为您在编译时知道类型T
;例如,A<Integer> a = new A<Integer>(Integer.class); // Integer.class matches the other Integer(s)
public class A<T> {
private Class<T> clazz;
public A(Class<T> clazz) {
this.clazz = clazz;
}
public T genericInstance() {
T target = null;
try {
// Class<T> clazz = getGenericClass();
target = clazz.newInstance();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return target;
}
}
答案 1 :(得分:2)
为了学习T,需要在类型定义上声明它。以下是使用TypeTools:
的示例// Declare a type that supplies String as an argument for T
class StringA extends A<String> {}
// Resolve T
Class<?> t = TypeResolver.resolveRawArgument(A.class, StringA.class);
assert t == String.class;
假设已在类型定义上声明了T,您可以在A的实现中解决它:
Class<?> t = TypeResolver.resolveRawArgument(A.class, getClass());