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

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


一、接口Type

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

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

二、一段实验代码与结果

代码:

public class Test {
    private String str;
    private int age;
    private String[] strArr;
    private List tList;
    private List[] tListArr;
    private List typeList;
    private List unKnowTypeList;
    private List 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----->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))