Java泛型反編譯
<T> <T extends Object> 沒有區(qū)別,因?yàn)門默認(rèn)是extends Object的,反編譯之后就是都是<T Object>

方法泛型調(diào)用
在JVM加載字節(jié)碼不存在<Goods>,只是編譯期存在




使用泛型類JVM加載字節(jié)碼存在<Goods> 具體泛型類型,沒有所謂的占位符(運(yùn)行期存在)



聲明的泛型方法 中的<E>是存在jvm字節(jié)碼的只不過這個(gè)E類型是Object,有占位符(運(yùn)行期存在)



泛型類定義的<T>是存在JVM加載的字節(jié)碼文件的只不過類型為Object,有占位符(運(yùn)行期存在)


<? extends Number> 被jvm加載 運(yùn)行期存在 <+ Number>



在方法上<? extends Number> 一樣被jvm加載 運(yùn)行期存在 <+ Number>



<? super Number>?被jvm加載 運(yùn)行期存在 <- Number>



<?>?被jvm加載 運(yùn)行期存在 <*>



<? extends T>?被jvm加載 運(yùn)行期存在 <+TT>



方法上定義的List<T> 運(yùn)行期存在<TT>



<T extends String> 運(yùn)行期存在 <T String>



<T extends Number & List<T> > 存在 <T:Number,List<TT>>



<T extends Number & List<? extends String> >存在<T Number List<+String>>




不存在

<T extends Number & List<? super String> >存在?<T Number List<-String>>




Class<T>? 存在 Class<TT> 這個(gè)T類型是Number類型 這個(gè)T必須是滿足是繼承Number類型或Number類型本身,并且實(shí)現(xiàn)了List接口<? super String> 這個(gè)T Class里面本身定義的是Object類型,這里存放進(jìn)行的T一定滿足是繼承Number或Number類型本身 &實(shí)現(xiàn)了List接口<? super String> 這個(gè)List里面的元素必須是String的本身或String的父類。List本身定義的是Object類型



List super的元素必須滿足 String類或String父類 jvm存在List<-String>




多個(gè)&之間使用的時(shí)候必須要滿足條件




Class<?>? 存在<*>




Class<? extends Number> 存在<+ Number> 類型是Number或 Number的子類 跟 使用?當(dāng)前類泛型的定義沒有關(guān)系




使用?跟當(dāng)前類定義的泛型沒有關(guān)系


get出來的是Number類型

堆空間的對(duì)象元素是有泛型的,??臻g指向這個(gè)堆空間對(duì)象情況下
(使用沒有指定泛型類情況下)類定義的泛型<T> 跟實(shí)例化出來該類型的對(duì)象無關(guān)系
在方法上List<T> list = new ArrayList<String>();
在方法上List<T> list = new ArrayList<Integer>();
list 跟 ArrayList<類型>都是同一種類型
但里面的泛型元素就有關(guān)系了(沒有指定泛型)會(huì)出現(xiàn)類型轉(zhuǎn)換錯(cuò)誤
在使用限定泛型就會(huì)進(jìn)行泛型檢測,會(huì)編譯不通過
不指定泛型,該對(duì)象變量,什么泛型類型的同類型都可以指向,雖然它們里面的泛型不是同一個(gè)類型



T類型被標(biāo)識(shí)為Integer類型

但只要涉及Class里面定義的泛型T使用,如果使用的時(shí)候T類型不匹配類型就會(huì)錯(cuò)誤,沒有使用就無所謂
返回的元素都是當(dāng)前類定義的泛型類型
原本Class類定義的是T是Object類型
在別的類定義了一個(gè)泛型CurrentClass<T extends Integer> 就是 CurrentClass<T:Integer>
那么使用在CurrentClass這個(gè)Class類的時(shí)候 Class<T> 就是 Class<T T> 這里的T指代T:Integer 而不是Object了
這個(gè)T就是 當(dāng)前泛型類定義的 T:Integer類型
在CurrentClass操作Class泛型T類型都是當(dāng)前類定義的T:Integer類型,那么Class類源碼定義的泛型都是當(dāng)中Integer類型使用
使用T泛型類型必須符合Integer相關(guān)語法操作,比如不能從String類型轉(zhuǎn)換到Integer類型
<T>默認(rèn)就是 <T extends Object>


Class里的方法返回的T類型編譯器就當(dāng)做是Integer

這個(gè)T就是Integer

<T>在方法泛型上會(huì)進(jìn)行泛型檢查,沒有類泛型


當(dāng)方法定義為泛型,類也定義為泛型,方法里面的<T>,方法內(nèi)部T<T>是使用方法泛型的T
此時(shí)必須在main方法指定泛型才會(huì)進(jìn)行泛型檢查,類使用的泛型檢測類的,方法使用的泛型檢測方法的泛型的
當(dāng)類沒有定義泛型的時(shí)候,直接使用方法泛型里使用<T>直接檢查,不管有沒有指定泛型都是有泛型約束
當(dāng)類定義泛型的時(shí)候,方法也定義泛型,在main方法不使用類泛型,方法泛型也不會(huì)進(jìn)行泛型檢查,
不會(huì)進(jìn)行泛型檢查,但是方法內(nèi)部都是方法定義的泛型類型。
因?yàn)榉椒ǚ盒蜋z查是按照類的實(shí)例來的,否則方法泛型定義為靜態(tài)方法泛型



類泛型里面使用方法參數(shù)<T>泛型,必須在main方法指定泛型才會(huì)檢查,否則無泛型約束
沒有方法泛型,有類泛型,方法定義中的T就是使用類的(直接泛型約束),否則就是使用方法泛型的
此圖無泛型約束


Test<K?Object;V Object>
Set<Test$Test2<Object;Integer>








