今天是劉小愛自學Java的第55天。
感謝你的觀看,謝謝你。
話不多說,開始今天的學習:
補充學習一個知識點:泛型。
這個概念是在集合中接觸到的,因為當時學的有點懵,所以就沒有立馬寫出來。
現在回過頭來看,發現還是蠻簡單的。
一、泛型的概念
先回顧下集合和數組的區別:
數組長度固定不變,可以存放任意數據類型,但存放的數據類型要一致。集合長度可變,可以存放任意引用數據類型,但存儲的數據類型可以不一致。也就是說一個集合既可以存放String類型的數據又可以存放Integer類型數據(int對應的引用數據類型)。
這樣就會出現一個問題:
比如說:現在有一個集合,打算存儲群裡所有人的名字,結果有的人搗亂把年齡也存進去了。
這個時候編譯是不會報錯的,因為集合本來就可以存放多種數據類型,但是我以為只有名字,也就是字符串。
①在Collection集合中添加一個String類型的數據。
②在Collection集合中添加一個Integer類型的數據(18會自動轉換成對應的引用數據類型)。
③現在我想統計群裡人名都是多少字的,我以為只有字符串,就會將其強轉成String並調用String的lenth方法。
④運行報錯,因為有一個其他數據類型的數據混進來了,編譯時期不能檢測到,運行時會出現類轉化異常。
所以面對這種問題該怎麼辦呢?
這種時候,就需要使用到泛型了。
創建集合時先說清楚,只能存放String類型的數據,這時候若是有人搗亂存儲其他類型的數據編譯就會報錯。
等於是將運行時期會發生的異常提前到編譯時期了。
所以泛型的作用是一種安全機制,是一種書寫規範,它和接口的作用有著一定的類似,都是在制定規則。
如何理解接口?
接口裡的抽象方法只有方法名,沒有方法體,實現類必須重寫該方法說明方法體。
用現實裡的一個例子說明就是:語文老師只給你一個題目,你要寫一篇800字的作文。
題目名就好比抽象方法,作文就好比實現類重寫方法。
所以接口就和作文題目一樣是在制定規則。
如何理解泛型?
作文題材不限,記敘文、議論文、詩歌都可以。
但是不能一篇作文既寫成記敘文又寫成議論文。
一旦你確定了題材(比如說寫議論文),那麼這篇作文就不能寫其他題材了(只能寫議論文)想寫其他題材,那下一篇作文重新寫。
所以什麼叫泛型?
就好比作文題材不限,但一次只能寫一種題材,至於是什麼題材,由我們自己定。
所以本質上泛型它是一個變量,它是需要我們去賦值的。
二、泛型的使用
主要有泛型類、泛型接口、泛型方法以及泛型通配符。
1泛型類
非常常見的ArrayList類就是一個泛型類,看它的源碼:
①泛型使用格式
修飾符 class 類名<代表泛型的變量> { };
ArrayList類中使用E來代表泛型的變量,E本身並沒有含義,任意一個大寫字母都可以,A、B、T、W都可以。
②泛型類的使用
在創建對象的時候確定泛型,指定好了後這個對象就只能裝指定的數據類型了。
如果要換其他數據類型,就要重新創建該類的對象,重新指定泛型。泛型類有何好處?
③ArrayList的add方法
add方法參數就是一個泛型,也就是說創建對象時確定的是哪個類型,使用add方法就只能添加這個類型了,這就起到了一個千變萬化的效果。
2泛型接口
①泛型接口格式
修飾符 interface接口名<代表泛型的變量> { }
這次我們自定義一個泛型接口,泛型為A。
②泛型類的使用一
實現類實現接口、同時指定泛型類型。
③泛型類的使用二
實現類實現接口但不指定泛型,這個類也就成了泛型類。
ArrayList類本質上也就是這種情況,它實現了List<E>接口,但是沒有指定泛型。
3泛型方法
①泛型方法格式
修飾符 <代表泛型的變量> 返回值類型 方法名(參數){ }
②泛型方法使用
調用方法時,確定泛型的類型。
4泛型通配符
現有一個需求:封裝一個方法,可以遍歷參數為任意類型的ArrayList
①兩個不同類型的集合
一個集合泛型為String類,一個集合泛型為Integer:
ArrayList<String>list1和ArrayList<Integer> list2是兩個不同的類型,如果用常規方法,那要兩個方法(方法重載)
②泛型的通配符
不知道使用什麼類型來接收的時候,此時可以使用?,?表示未知通配符。
其中泛型通配符還可以這樣使用:
<? extends Person>:表示可以傳遞Person及其子類<? super Person>:表示可以傳遞Person及其父類注意:
泛型不存在繼承關係:ArrayList<Object>list並不是ArrayList<String>list1和ArrayList<Integer>list2的父類,它們三個是三個不同的類型。其中Java裡的泛型是一種偽泛型。什麼叫偽泛型?
也就是泛型只存在於編譯時期,在運行時期會被擦除,這個比較抽象不好說明,了解就好了。真泛型也是有的,但在Java語言裡沒有,C語言裡有。
總結:
謝謝你的觀看。
如果可以的話,麻煩幫忙點個讚,謝謝你。