zoukankan      html  css  js  c++  java
  • Java中如何获取一个类中泛型的实际类型

     

    本文链接:https://blog.csdn.net/kuuumo/article/details/83021158
     
    ______________________________________________________________________________________________________

    Java获取泛型T的类型 T.class

    https://blog.csdn.net/changsa65/article/details/78790881

    Java如何优雅获取泛型类型

    https://blog.csdn.net/rlnLo2pNEfx9c/article/details/90358659
    ____________________________________________________________________________________________________________
     
     
     

    1.学习之前我们先来了解一些泛型的术语
    <>: 念做typeof
    List<E>: E称为类型参数变量
    ArrayList<Integer>: Integer称为实际类型参数
    ArrayList<Integer>: 整个ArrayList<Integer>称为参数化类型(对应着java.lang.reflect.ParameterizedType接口)

    2.泛型反射相关API
    Type[]  getGenericInterfaces():获得当前类实现的泛型接口(参数化类型)
    举例1:
    1)定义类A,C 接口B

    //类B
    public interface B{}


    //类C
    public class C{}


    //A实现B,向B传入实际类型参数C
    public class A implements B<C>{}

    2)测试代码

    A a = new A();
    Type[] types = a.getClass().getGenericInterfaces();
    for (Type type : types) {

              System.out.println(type);//结果是:B<C>
    }

    Type[]  getGenericSuperclass():获得带有泛型的父类
    举例2:
    1)定义3个类A,B,C

    //类B
    public class B{}


    //类C
    public class C{}


    //A继承B,向B传入实际类型参数C
    public class A extends B<C>{}

    2)测试代码

    A a = new A();
    Type type = a.getClass().getGenericSuperclass();
    System.out.println(type);//结果是:B<C>

    ParameterizedType:参数化类型接口,Type的子接口
    通过上面两个案例可知getGenericInterfaces和getGenericSuperclass可以获取到参数化类型B<C>,并且ParameterizedType是Type的子接口,将Type强转成ParameterizedType。ParameterizedType提供了一个getActualTypeArguments()方法,这个方法可以获取参数化类型中的实际类型参数。
    举例3:我们对案例2测试代码进行修改

    A a = new A();
    //获得带有泛型的父类
    Type type = a.getClass().getGenericSuperclass();
    System.out.println(type);//结果是:B<C>
    //将type强转成Parameterized
    ParameterizedType pt = (ParameterizedType )type;
    /*得到父类(参数化类型)中的泛型(实际类型参数)的实际类型。
    getActualTypeArguments()返回一个Type数组,之所以返回Type数组,是因为一个类上有可能出现多个泛型,比如:Map<Integer,String>
    */
    Type [] actualTypes = pt.getActualTypeArguments();
    System.out.println(actualTypes[0]);//结果:C

    获取接口泛型的实际类型参数做法跟上面代码差不多,只需要把
    Type type = a.getClass().getGenericSuperclass(),改成
    Type type = a.getClass().getGenericInterfaces()就可以了。

    讲解完毕,如有错漏请多多包含!!!!!

     
  • 相关阅读:
    文件拖拽上传
    30天自制操作系统笔记(第三天)
    PAT 1040到底有几个pat
    pat 1039 到底买不买
    pat 1038 统计同成绩学生
    pat 乙级1034
    pat 乙级1022
    pat 乙级1009
    pat 乙级1008
    pat 乙级1002
  • 原文地址:https://www.cnblogs.com/kelelipeng/p/11922530.html
Copyright © 2011-2022 走看看