參考:http://www.javashuo.com/article/p-utzdmukn-n.htmljava
Type —— Java類型
Type是一個空接口,全部類型的公共接口(父接口),其意義表示Java全部類型,這裏所謂的類型是從Java整個語言角度來看的,好比原始類型、參數化類型(泛型)、類型變量及其數組等,能夠理解爲,Class(類)是Java對現實對象的抽象,而Type是對Java語言對象的抽象。數組
Type的子孫
概述
注意區分類型(Type)與類(Class)的區別,這裏Class是Type的一種,而像數組、枚舉等「類型」是相對於Class來講。spa
@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這樣的通配符表達式。.net
Type的直接子類
Type的直接子類只有一個,也就是Class,表明着類型中的原始類型以及基本類型。關於Class詳見:Class —— 反射基石。code
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類型之類型變量。blog
3.GenericArrayType
泛型數組,表示上面兩種的數組類型,即形如:A<T>[],T[][]類型。
GenericArrayType詳見:Java類型之泛型數組。接口
4.WildcardType
通配符表達式,或泛型表達式,它雖然是Type的一個子接口,但並非Java類型中的一種,表示的僅僅是相似 ? extends T、? super K這樣的通配符表達式。
WildcardType詳見:Java類型之泛型表達式。get
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,應該指的是二、4類型數組,而不是通常咱們說的數組,咱們通常所說的數組是指一、5類型數組,他們仍是1,也就是Class類型。
3). List<T ? entends>[]:這裏的List就是ParameterizedType,T就是TypeVariable,T ? entends就是WildcardType(注意,WildcardType不是Java類型,而是一個表達式),整個List<T ? entends>[]就是GenericArrayType。it