【问题标题】:How to get concrete type of a generic interface如何获得通用接口的具体类型
【发布时间】:2010-07-14 14:22:15
【问题描述】:

我有一个界面

public interface FooBar<T> { }

我有一个实现它的类

public class BarFoo implements FooBar&lt;Person&gt; { }

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

我使用来自 BarFoo 的 .getInterfaces 返回 FooBar,但这并不能帮助我找出 T 是什么。

【问题讨论】:

    标签: java reflection


    【解决方案1】:

    您可以通过Class#getGenericInterfaces() 获取类的通用接口,然后检查它是否为ParameterizedType,然后相应地获取actual type arguments

    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);
            }
        }
    }
    

    【讨论】:

    • 请注意,如果他们将BarFoo 定义为通用BarFoo&lt;T&gt; 然后使用new BarFoo&lt;Person&gt;(),这将不起作用,即使从“他们”的角度来看这将是等效的。
    • 是的。在这种情况下,这是我自己的代码,我只是在做反射来测试它。就我而言,它们都将在编译时声明。
    【解决方案2】:

    尝试以下方法:

    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];
    }
    

    【讨论】:

    • GenericSuperClass != GenericInterface
    • 关闭,但它没有让我进入界面。 BalusC 缺少链接。
    • 啊错过了差异。好吧,如果您需要 GenericSuperClass,请使用它 :)
    猜你喜欢
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 2017-06-18
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多