參考:https://blog.csdn.net/a327369238/article/details/52621043
Type —— Java類型
Type是一個空接口,所有類型的公共接口(父接口),其意義表示Java所有類型,這里所謂的類型是從Java整個語言角度來看的,比如原始類型、參數化類型(泛型)、類型變量及其數組等,可以理解為,Class(類)是Java對現實對象的抽象,而Type是對Java語言對象的抽象。
Type的子孫
概述
注意區分類型(Type)與類(Class)的區別,這里Class是Type的一種,而像數組、枚舉等“類型”是相對於Class來說。
@org.junit.Test public void test5() throws NoSuchMethodException { String[] s=new String[]{"1"}; Class<? extends String[]> aClass1 = s.getClass(); if (String[].class.isAssignableFrom(aClass1)){ System.out.println(11111); } Class<? extends DeleteFlagEnum> aClass2 = DeleteFlagEnum.DELETE.getClass(); if (Enum.class.isAssignableFrom(aClass2)){ System.out.println(2222); } //從下面方法可以看出,具體的枚舉類,是Enum的子類 //DeleteFlagEnum的父類是Enum s.getClass().isEnum(); }
Type的直接子接口
1.ParameterizedType: 表示一種參數化的類型,比如Collection,即普通的泛型。
2.TypeVariable:是各種類型變量的公共父接口,就是泛型里面的類似T、E。
3.GenericArrayType:表示一種元素類型是參數化類型或者類型變量的數組類型,比如List<>[],T[]這種。
4.WildcardType:代表一種通配符類型表達式,類似? super T這樣的通配符表達式。
Type的直接子類
Type的直接子類只有一個,也就是Class,代表着類型中的原始類型以及基本類型。關於Class詳見:Class —— 反射基石。
Type子接口解析
1.ParameterizedType
參數化類型,即泛型,類似List<T>、Map<Integer, String>、List<? extends Number>帶有類型參數的類型,當然,也可以是自定義的,再調用getRawType()與getActualTypeArguments()兩個方法,就可以得到聲明此參數化類型的類(java.lang.Comparable)和實際的類型參數數組([? super T]),而這個? super T又是一個WildcardType類型。
ParameterizedType詳見:Java類型之參數化類型。
2.TypeVariable
類型變量,如參數化類型中的E、K等類型變量,表示泛指任何類,如果加上extends/super限定,則就會有相應的上限、下限。
TypeVariable詳見:Java類型之類型變量。
3.GenericArrayType
泛型數組,表示上面兩種的數組類型,即形如:A<T>[],T[][]類型。
GenericArrayType詳見:Java類型之泛型數組。
4.WildcardType
通配符表達式,或泛型表達式,它雖然是Type的一個子接口,但並不是Java類型中的一種,表示的僅僅是類似 ? extends T、? super K這樣的通配符表達式。
WildcardType詳見:Java類型之泛型表達式。
Java類型分類
Java的所有類型包括:
1. raw type:原始類型,對應Class
2. parameterized types:參數化類型,對應ParameterizedType
3. array types:數組類型,對應GenericArrayType
4. type variables:類型變量,對應TypeVariable
5. primitive types:基本類型,仍然對應Class
1). 1中的Class,不僅僅指平常所指的類,還包括數組、接口、注解、枚舉等結構。
2). 3中的數組類型GenericArrayType,應該指的是2、4類型數組,而不是一般我們說的數組,我們一般所說的數組是指1、5類型數組,他們還是1,也就是Class類型。
3). List<T ? entends>[]:這里的List就是ParameterizedType,T就是TypeVariable,T ? entends就是WildcardType(注意,WildcardType不是Java類型,而是一個表達式),整個List<T ? entends>[]就是GenericArrayType。