這是乙個關於 extends t>和 super t>的說明文章,有圖、有文說的很好
看完整個文章之後,大概能夠明白這2個東西是怎麼用的。但是這時候,你還是摸不著頭腦,到底怎麼用,我覺得需要分2部分理解,就很好理解,並且能上手。
部分1:型別型別之間的關係
部分2:型別和例項之間的關係
說的很含糊,這裡我分開講下,你們會恍然大悟,並且知道怎麼上手。
其實就是?和t和具體型別之間的關係,其實可以這樣理解:
? 相關的是泛型某個具體t引用,而t(不是具體型別)是對型別的引用。
也就是?它是t的變數,t是具體型別的變數。
這麼說可能還是不能理解,我舉乙個例子:
**** f = new ****();
其中的f就是乙個變數對吧,它是對型別****的乙個變數。對具體的引用。
?在官方文件中的解釋是:unknown type
所以:?包含了所有t(一次性可以包含多種型別的t),而t包含了所有的具體型別(一次性只能乙個型別)為了讓你們認可這個概念,我舉幾個例子:?指向具體的t,t指向具體的型別,?也能指向具體型別。
例子1:
上圖看到了,提示無法例項化?,也就是說,右邊只能是具體型別t,或者是t的更具體型別,在這個情況下,只能是具體型別。
完美解決。
例子2:
類上無法使用?,?代表多種型別的t,因為類需要用具體某個型別的t才能使用。
完美解決。
例子3:
我們知道 super t>指的是"下界萬用字元",也就是,所有的型別都是t這個型別的父型別:
上面的**很明確的表示了?能夠容納具體某種型別。
還要強調的是, super t>, extends t> 要分2部分理解,以上部分指的是型別和型別的關係,下面一部分,說明下 super t>, extends t> 和例項的關係(new出來的)這裡在說明下型別和型別之間的關係:
? extends t:也就是上界萬用字元(能匹配的都是t以及以下的),說明的是,我這個型別只能接受t的子型別以及t
? super t :是下界萬用字元(能匹配的都是t以及以上的)也就是說,我這個型別只接受t的父型別以及t
在回頭看看上面那個:
所有右邊的都是左邊的父類行,再次強調,這部分這個是型別和型別之間的關係
extends也是同樣,說的是型別和型別之間的關係。
右邊的全是extends fruit所以這2個型別之間相等。
? extends t和? super t 在具體型別上,為什麼會出現get和set不同的不允許操作呢?其實很好理解。
從資料保證不出錯上理解。
有了上面的基礎我們知道 (再次強調)你應該這麼理解,具體例項跟具體型別相關(1),具體型別和?相關(2)? extends t能夠容納的型別肯定是t的子類型別
? super t能夠容納的型別肯定是t父類型別
型別!型類!型類!型型別!別跟例項扯關係!!!!!!
那為什麼sett不了呢?
因為? extends fruit 那麼如果在list的情況下,這個問題會明顯多了
使用:list extends fruit>,也就可以有以下正常情況:
那get呢?這裡有了上界,最高的介面是fruit,所以以fruit方式獲取是沒有問題的。
fruit fruit = f.get(0); //ok
所以應該這麼想,還是1到2
修改ing…
Java 泛型總結
泛型指引數化型別的能力,可以定義帶泛型型別的類或方法,隨後編譯器會用具體的型別來替換它。在泛型產生之前,像集合的訪問都是靠強制型別轉換 public class arraylist public void add object o string filename string names.get 0...
Java泛型總結
1 泛型主要是用來年解決資料型別安全的問題,用標識來代替屬性的型別或者返回值的型別 2 在使用泛型的時候可以有以下幾種形式 泛型介面 泛型類 萬用字元做泛型引數 泛型方法 泛型陣列 3 以下通過 說明 package com.sun.demo 一 定義泛型介面 inte ce father 二 定義...
java泛型總結
1.概念 泛型實現了引數化型別的概念,其最初的目的是希望類或方法能夠具備最廣泛的表達能力。通俗來說就是為了避免轉換出錯,限制資料型別。通過解耦類或者方法與所使用的型別之間的約束。list thelist1 new arraylist arrays.aslist 1,2,3,string for ob...