如何获得具体类型的通用接口

bwa*_*wok 18 java reflection

我有一个界面

public interface FooBar<T> { }
Run Code Online (Sandbox Code Playgroud)

我有一个实现它的类

public class BarFoo implements FooBar<Person> { }

通过反射,我想获取BarFoo的一个实例并得到它实现的FooBar版本是Person.

我使用.getInterfacesBarFoo回到FooBar,但这并没有帮助我找出T是什么.

Bal*_*usC 35

您可以获取类的通用接口,Class#getGenericInterfaces()然后依次检查它是否为a ParameterizedType,然后相应地获取实际的类型参数.

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果他们将`BarFoo`定义为通用的`BarFoo <T>`然后使用`new BarFoo <Person>()`,这将无法工作,即使这与"他们的"视角相同. (4认同)

mat*_*t b 5

尝试以下内容:

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];
}
Run Code Online (Sandbox Code Playgroud)

  • GenericSuperClass!= GenericInterface (2认同)
  • 啊错过了差异.好吧,如果你需要GenericSuperClass,请使用它:) (2认同)