获取接口或父类的类型和类型变量的类型

原理

  1. 通过类对象的genericSuperclass与getGenericInterfaces获取父类或接口类型。
  2. 强转为参数化类型ParameterizedType,即带有类型参数的类型,入List,List
  3. 通过ParameterizedType的getActualTypeArguments方法获取参数化类型的所有类型变量

代码

构造需要的类

public class SampleTest {
    interface A<T>{

    }
    interface B<T,E>{

    }
    class C<T>{

    }
    class D <T,E>{

    }
    class E implements B<A,C>{

    }

    class F extends D<A,C>{

    }
}

获取接口类型和类型变量


    @Test
    public void testInterface(){
        E e = new E();
        Type[] genericInterfaces = e.getClass().getGenericInterfaces();
        for (Type genericInterface : genericInterfaces) {
            System.out.println("---"+genericInterface.getTypeName());
            if (ParameterizedType.class.isAssignableFrom(genericInterface.getClass())){
                ParameterizedType parameterizedType = (ParameterizedType) genericInterface;
                Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
                for (Type actualTypeArgument : actualTypeArguments) {
                    System.out.println(actualTypeArgument.getTypeName());
                }
            }
        }
    }

输出:

---com.github.felix.poetrycrawl.SampleTest$B<com.github.felix.poetrycrawl.SampleTest$A, com.github.felix.poetrycrawl.SampleTest$C>
com.github.felix.poetrycrawl.SampleTest$A
com.github.felix.poetrycrawl.SampleTest$C

获取父类类型和类型变量

    @Test
    public void test(){
        F f = new F();
        Type genericSuperclass = f.getClass().getGenericSuperclass();
        System.out.println("---"+genericSuperclass.getTypeName());
        if (ParameterizedType.class.isAssignableFrom(genericSuperclass.getClass())) {
            ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
            for (Type actualTypeArgument : actualTypeArguments) {
                System.out.println(actualTypeArgument.getTypeName());
            }
        }

    }

输出

---com.github.felix.poetrycrawl.SampleTest$D<com.github.felix.poetrycrawl.SampleTest$A, com.github.felix.poetrycrawl.SampleTest$C>
com.github.felix.poetrycrawl.SampleTest$A
com.github.felix.poetrycrawl.SampleTest$C
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值