通過這些網(wǎng)友分享的資料
https://www.cnblogs.com/lwbqqyumidi/p/3837629.html
https://www.cnblogs.com/lihaoyang/p/7104293.html
為什么出現(xiàn)java泛型:
先看一個例子:? List list = new List(); list.add(Object);? 可以添加任何是 object子類的對象
假如添加了 String 后又添加 int 在輸出的時候通過for循環(huán):
String name = (String) list.get(i);
System.out.println("name:" + name);
那么會出現(xiàn)?java.lang.ClassCastException 異常全肮。這是在強轉(zhuǎn)的數(shù)據(jù)類型的時候?qū)е碌摹?/p>
這種胡亂添加的行為如果沒有按規(guī)定當然是會出差錯描验。 java泛型的提出就是一個規(guī)范,規(guī)范了一組數(shù)據(jù)的類型一致性九秀。即便有人想亂來也不會添加數(shù)據(jù)成功摘刑。
我自己對泛型實現(xiàn)的思路:?
(1)需要一個方法阻止別人亂來萌焰。(2)這個方法如何實現(xiàn)?(3) java的方法? public void fun();
(4)要阻止別人亂來就需要一個限制。(5) public void fun(int XXX);(6) 可以利用參數(shù)的類型作為入口的限制,限制了入口呈宇,別人想亂來也不可能(7)正是這個參數(shù)類型好爬,使得別人想傳個 string 或者其他類型進來都會編譯失敗。(8)那么基于這個思想甥啄,可以擴大到為 類,對象 實現(xiàn)這種規(guī)范存炮。
這個實現(xiàn)被java 叫 :? 參數(shù)化類型? 即 泛型
List<String> list = new ArrayList<String>();?
list.add("qqyumidi");? list.add("corn");? ? 這樣想亂叫別的類型自然是報錯的
自定義泛型:
class abc <T>{
private T i;
public T Gettaobao() { return i; }
public void ste(T i) { this.i = i; }? ? ? ?}??
在泛型接口、泛型類和泛型方法的定義過程中蜈漓,我們常見的如T穆桂、E、K融虽、V等形式的參數(shù)常用于表示泛型形參享完,由于接收來自外部使用時候傳入的類型實參。
注意:
abc <Integer> age = new abc<>();? ? ? ? ? abc <String> agS = new abc<>(); System.out.println("name class:" + age.getClass()); // name class:class exercise.abc System.out.println("age class:" + agS.getClass()); // age class:class exercise.abc System.out.println(agS.getClass() == age.getClass()); // true
我們發(fā)現(xiàn)有额,在使用泛型類時般又,雖然傳入了不同的泛型實參,但并沒有真正意義上生成不同的類型巍佑,傳入不同泛型實參的泛型類在內(nèi)存上只有一個茴迁,即還是原來的最基本的類型(本實例中為Box),當然萤衰,在邏輯上我們可以理解成多個不同的泛型類型堕义。
為什么?為什么?為什么?
其原因脆栋,在于Java中的泛型這一概念提出的目的倦卖,導致其只是作用于代碼編譯階段,在編譯過程中椿争,對于正確檢驗泛型結(jié)果后怕膛,會將泛型的相關信息擦出,也就是說丘薛,成功編譯過后的class文件中是不包含任何泛型信息的嘉竟。泛型信息不會進入到運行時階段。所以想看泛型實現(xiàn)的源碼的同學還是不要和我一樣癡心妄想了。
類型通配符 舍扰? 的此處不講倦蚪。
進一步拓展:? 繼承泛型類
?extends 子類繼承了 泛型父類?
class abcd<T> extends abc<T>? ?//那么子類必須也是泛型
通過java繼承可知,父類的一切包括 泛型 也會被繼承過來边苹。
但是在實現(xiàn)泛型的時候又是有些區(qū)別:
class abc <T,E> //father? ?
class abcd<T, E> extends abc<T,E>? //全保留
class abcd<T> extends abc<T,Integer>? ?//部分參數(shù)類型保留下而已,但是父類的泛型有一個參數(shù)必須具體化陵且。否則會報錯
class abcd<A,B> extends abc<String,Integer>??
class abcd<A,B> extends abc//類型擦除
拓展小知識:
class? ab<A,B> extends Father//泛型擦除時,(按object處理)(存在警告)个束。
ab<object,object> a = new??ab<object,?object?> ()
ab a = new?ab ()
上述兩個創(chuàng)建對象在編譯時慕购,雖然同樣是按 object 處理,但是 第一個會進行 類型檢查茬底,不會出現(xiàn)警告沪悲。第二個會出現(xiàn)警告,不會類型檢查
拓展大知識:??泛型接口:與泛型類 同理阱表。
Java中的實際類型信息不管是編譯時期還是在運行時期都被擦除了殿如,這就是擦除的效果。由于有了擦除最爬,Java編譯器無法將obj調(diào)用f()這一需求映射到HasF擁有f()這一事實上涉馁。(事實上擦除是將泛型類型信息擦除到了它的第一個邊界,默認不設置的邊界是Object爱致,你可以調(diào)用Object的方法烤送,可以這樣設置邊界——<T extends HasF>,設置邊界后就可以調(diào)用f()了
---------------------
作者:李簡單
來源:CSDN
原文:https://blog.csdn.net/holleykitty/article/details/80481527
版權聲明:本文為博主原創(chuàng)文章糠悯,轉(zhuǎn)載請附上博文鏈接帮坚!