这几乎是唯一一种做到的方法:
import java.lang.reflect.*;
class Main {
public static void main(String args[]) throws Exception {
var baz = new Foo<Baz>() {};
System.out.println(baz.bar);
}
}
class Baz {
}
class Foo<T> {
T bar;
public Foo() throws Exception {
Type actualTypeArgument = ((ParameterizedType)this.getClass()
.getGenericSuperclass())
.getActualTypeArguments() [0];
System.out.println(actualTypeArgument);
Class<T> clazz = (Class<T>) actualTypeArgument;
bar = clazz.newInstance();
}
}
但是代价是必须在所有初始化的地方这么写 new Foo<Baz>() {} 而且 newInstance 也会假设一定有个无参构造函数。
最有名的使用场景就是 fastjson 的 TypeReference 了, fastjson 为了在运行时拿到泛型的信息,就通过这个传进来的
https://github.com/alibaba/fastjson/blob/master/src/main/java/com/alibaba/fastjson/TypeReference.java你这个场景下其实构造函数传一个 Class<T>进来会更直接一点