最简单的方法就是把泛型 Class 通过构造函数注入进去:public class Child implements Parent {
private Class cls;
public Child(Class cls) {
this.cls = cls;
}
@Override
public Class clazz() {
return cls;
}
}
当然还有更复杂的通过反射的方法, 但是因为类型擦除, 类自己的反射是获取不到自身的泛型类型的, 必须通过泛型类型元素的母元素反射获取:public class Main {
public List list;
public static void main(String[] args) throws Exception {
// 这样是拿不到泛型类型 Integer
List l = new ArrayList<>();
// 输出的是 ArrayList 声明的泛型变量 T
final TypeVariable extends Class extends List>>[] types = l.getClass().getTypeParameters();
for (TypeVariable extends Class extends List>> type : types) {
System.out.println(type.getName());
}
// 这样是可以拿到泛型类型 String
final Field list = Main.class.getField("list");
final Type genericType = list.getGenericType();
System.out.println(genericType.getTypeName());
if(genericType instanceof ParameterizedType) {
ParameterizedType t = (ParameterizedType) genericType;
System.out.println(Arrays.toString(t.getActualTypeArguments()));
}
}
}