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

statement:本篇內(nèi)容只是建立在我目前經(jīng)驗(yàn)的基礎(chǔ)之上,必然有不完善甚至是不正確的地方,請謹(jǐn)慎閱讀,如果能指出錯誤與不足之處,更是不甚感激


一、接口Type

接口Type(注意是java.lang.reflect中的),代表了Java中泛型類型超接口,實(shí)現(xiàn)它的共有四個接口和一個類,即接口:ParameterizedType、GenericArrayType、WildcardTypeTypeVariable<D>,還有類:Class

  • ParameterizedType代表的是像List<String> x、Person<Integer> x(Person是一個虛構(gòu)的帶泛型的類)這樣的,x的類型就會是ParameterizedType
  • GenericArrayType代表的是像List<String>[] x、Person<Integer>[] x這樣的由ParameterizedType類型組合起來的類型,這時x的類型會是GenericArrayType
  • TypeVariable代表是泛型變量,比如T x或者List<T> x,前者x的類型為TypeVariable,后者x本身是ParameterizedType,但是其泛型參數(shù)列表的第一個(共一個)參數(shù)的類型是TypeVariable,不同于List<String>,由于String是確定的類,所以其泛型參數(shù)列表第一個參數(shù)類型是Class
  • WildcardTypeTypeVariable相似,只是其代表的是一種更廣范圍的泛型變量,比如? extends T、? extends Person等等,如List<? extends Person>其泛型參數(shù)列表的第一個參數(shù)類型即為WildcardType而不是TypeVariable

二、一段實(shí)驗(yàn)代碼與結(jié)果

代碼:

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());
            }
        });
    }
}

結(jié)果:

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 詳解

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容