JAVA8 获取泛型类型问题

发布于 2022-09-11 16:36:18 字数 534 浏览 22 评论 0

请教一个关于泛型的问题:
有如下带泛型的接口

public interface AAA<C,M,S> {}

public interface BBB<T extends Number> extends AAA<T,String,Boolean> {}

public interface CCC extends BBB<Integer> {}

public class DDD implements CCC {}

我想获取任意继承了AAA接口或实现了AAA接口的类型,对应AAA泛型参数中 C,M,S 分别对应什么实际类型。
例如:DDD中,C = Integer , M = String , S = Boolean
BBB 中,C = <T extends Number> , M = String , S = Boolean

有时这个类型是用在字段的前面,同时距离 AAA 有好几层继承关系,有没有什么好办法,可以方便地获知,最终的类型对应 AAA 的 参数 C,M,S 分别是什么?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

写给空气的情书 2022-09-18 16:36:19

除了 @_TNT_ 的答案,我花了点时间还找到了另外一个答案,原理应该是相同的。
TypeResolver GitHub 仓库
TypeTools Maven 仓库

嘿嘿嘿 2022-09-18 16:36:19

除借助 IDE 的提示, 我也不知道还有什么好办法, 因为很多泛型只有在实例化时才能转为具体的类型. 如果你只是在写低层架构的话, 甚至可能不会与具体类弄打交道, 一直都是在写抽象类型也是可能的.

極樂鬼 2022-09-18 16:36:18

最开始的版本忘记了接口的情况…

public class EEE {

    public static void main(String[] args) {
        List<Type> types = new ArrayList<>();
        findAllTypes(DDD.class, types);
        System.out.println(types);
    }

    private static void findAllTypes(Class<?> clazz, List<Type> types) {
        Type genericSuperclass = clazz.getGenericSuperclass();
        if (genericSuperclass instanceof ParameterizedType) {
            Collections.addAll(types, ((ParameterizedType) genericSuperclass).getActualTypeArguments());
        }
        Type[] genericInterfaces = clazz.getGenericInterfaces();
        for (final Type genericInterface : genericInterfaces) {
            if (genericInterface instanceof ParameterizedType) {
                Collections.addAll(types, ((ParameterizedType) genericInterface).getActualTypeArguments());
            }
        }
        Class<?> superclass = clazz.getSuperclass();
        if (superclass != null) {
            findAllTypes(superclass, types);
        }
        for (final Class<?> anInterface : clazz.getInterfaces()) {
            findAllTypes(anInterface, types);
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文