Java 泛型總結,思考,保留

2021-09-02 05:05:36 字數 2478 閱讀 9788

這是乙個關於 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不同的不允許操作呢?其實很好理解。

從資料保證不出錯上理解。

有了上面的基礎我們知道 (再次強調)

? extends t能夠容納的型別肯定是t的子類型別

? super t能夠容納的型別肯定是t父類型別

型別!型類!型類!型型別!別跟例項扯關係!!!!!!

你應該這麼理解,具體例項跟具體型別相關(1),具體型別和?相關(2)

那為什麼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...