如何获取泛型接口的具体类型
2022-09-02 00:32:40
我有一个接口
public interface FooBar<T> { }
我有一个实现它的类
public class BarFoo implements FooBar<Person> { }
通过反思,我想举一个BarFoo的实例,并得到它实现的FooBar版本是Person。
我使用BarFoo回到FooBar,但这并不能帮助我找出T是什么。.getInterfaces
我有一个接口
public interface FooBar<T> { }
我有一个实现它的类
public class BarFoo implements FooBar<Person> { }
通过反思,我想举一个BarFoo的实例,并得到它实现的FooBar版本是Person。
我使用BarFoo回到FooBar,但这并不能帮助我找出T是什么。.getInterfaces
你可以通过 Class#getGenericInterfaces()
获取类的泛型接口,然后你反过来检查它是否是参数化类型
,然后相应地获取实际的类型参数。
Type[] genericInterfaces = BarFoo.class.getGenericInterfaces();
for (Type genericInterface : genericInterfaces) {
if (genericInterface instanceof ParameterizedType) {
Type[] genericTypes = ((ParameterizedType) genericInterface).getActualTypeArguments();
for (Type genericType : genericTypes) {
System.out.println("Generic type: " + genericType);
}
}
}
请尝试类似下面的操作:
Class<T> thisClass = null;
Type type = getClass().getGenericSuperclass();
if (type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) type;
Type[] typeArguments = parameterizedType.getActualTypeArguments();
thisClass = (Class<T>) typeArguments[0];
}