美文网首页
Java--泛型 Type(java.lang.reflect)

Java--泛型 Type(java.lang.reflect)

作者: 睦月MTK | 来源:发表于2020-09-11 11:42 被阅读0次

    statement:本篇内容只是建立在我目前经验的基础之上,必然有不完善甚至是不正确的地方,请谨慎阅读,如果能指出错误与不足之处,更是不甚感激


    一、接口Type

    接口Type(注意是java.lang.reflect中的),代表了Java中泛型类型超接口,实现它的共有四个接口和一个类,即接口:ParameterizedTypeGenericArrayTypeWildcardTypeTypeVariable<D>,还有类:Class

    • ParameterizedType代表的是像List<String> xPerson<Integer> x(Person是一个虚构的带泛型的类)这样的,x的类型就会是ParameterizedType
    • GenericArrayType代表的是像List<String>[] xPerson<Integer>[] x这样的由ParameterizedType类型组合起来的类型,这时x的类型会是GenericArrayType
    • TypeVariable代表是泛型变量,比如T x或者List<T> x,前者x的类型为TypeVariable,后者x本身是ParameterizedType,但是其泛型参数列表的第一个(共一个)参数的类型是TypeVariable,不同于List<String>,由于String是确定的类,所以其泛型参数列表第一个参数类型是Class
    • WildcardTypeTypeVariable相似,只是其代表的是一种更广范围的泛型变量,比如? extends T? extends Person等等,如List<? extends Person>其泛型参数列表的第一个参数类型即为WildcardType而不是TypeVariable

    二、一段实验代码与结果

    代码:

    public class Test<T> {
        private String str;
        private int age;
        private String[] strArr;
        private List<T> tList;
        private List<T>[] tListArr;
        private List<Type> typeList;
        private List<? extends Type> unKnowTypeList;
        private List<? extends T> unKnowTList;
        private T t;
    
        public static void main(String... args){
            Test test = new Test();
            Arrays.stream(Test.class.getDeclaredFields()).forEach(item -> {
                Type type = item.getGenericType();
                System.out.println(item.getName() + "--------->" +type.getClass());
                if(type instanceof ParameterizedType){
                    ParameterizedType pt = (ParameterizedType)type;
                    if (pt.getOwnerType() != null) {
                        System.out.println(pt.getOwnerType().getTypeName());
                    }
                    System.out.println(item.getName() + "----rawType----->" +pt.getRawType().getTypeName());
                    Arrays.stream(pt.getActualTypeArguments()).forEach(ar -> {
                        System.out.println(item.getName() + "----argType," + ar.getTypeName() + "----->" +ar.getClass() );
                    });
                }else if(type instanceof GenericArrayType){
                    GenericArrayType pt = (GenericArrayType)type;
                    System.out.println(item.getName() + "----componentType,"+pt.getGenericComponentType().getTypeName() + "----->" +pt.getGenericComponentType().getClass());
                }
            });
        }
    }
    

    结果:

    str--------->class java.lang.Class
    age--------->class java.lang.Class
    strArr--------->class java.lang.Class
    tList--------->class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
    tList----rawType----->java.util.List
    tList----argType,T----->class sun.reflect.generics.reflectiveObjects.TypeVariableImpl
    tListArr--------->class sun.reflect.generics.reflectiveObjects.GenericArrayTypeImpl
    tListArr----componentType,java.util.List<T>----->class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
    typeList--------->class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
    typeList----rawType----->java.util.List
    typeList----argType,java.lang.reflect.Type----->class java.lang.Class
    unKnowTypeList--------->class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
    unKnowTypeList----rawType----->java.util.List
    unKnowTypeList----argType,? extends java.lang.reflect.Type----->class sun.reflect.generics.reflectiveObjects.WildcardTypeImpl
    unKnowTList--------->class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
    unKnowTList----rawType----->java.util.List
    unKnowTList----argType,? extends T----->class sun.reflect.generics.reflectiveObjects.WildcardTypeImpl
    t--------->class sun.reflect.generics.reflectiveObjects.TypeVariableImpl
    

    参考文档:
    [1] java Type 详解

    相关文章

      网友评论

          本文标题:Java--泛型 Type(java.lang.reflect)

          本文链接:https://www.haomeiwen.com/subject/uwuajktx.html