1. 程式人生 > 實用技巧 >泛型List<? extends SuperClass>、List<? super SubClass>是什麼含義?怎麼使用?

泛型List<? extends SuperClass>、List<? super SubClass>是什麼含義?怎麼使用?

一、泛型的分類

1、無限萬用字元List<?> list

2、上界萬用字元List<? extends SuperClass>

3、下界萬用字元List<? super SubClass>

二、無限萬用字元List<?> list

這種就是開發中使用最多的,不詳細講解

三、上界萬用字元List<? extends SuperClass>

以List<? extends String>為例來講解一下含義:

這是個List,其中的陣列指以String為上界的型別,你不可以往這個陣列插入String型別,因為你這有可能是個SubString的陣列,你只能保證讀出來的資料是String型別的,因此只能作為生產者,裡面的資料可以被消費

比如:List<? extends 水果>

你知道這個容器可能是:香蕉List,也可能是蘋果List,但肯定是某一種水果的List。你不能放水果進入是因為,假如你放的是水果(香蕉),但實際上是個蘋果List,就會在執行期報異常。同樣道理你也不能放水果(蘋果)進入。這個容器不能放任何型別的東西進去,因為沒有下界,你不知道下界,你唯一知道的是從這個容器裡拿出來的是水果。這是個產出水果的容器(生產者),裡面的元素拿出來就是水果(可以直接當做水果消費掉)。也就是說,這個陣列只能被消費,不能生產資料,也就是不能往裡面存資料

四、下界萬用字元List<? super SubClass>

下界<? super T>不影響往裡存,但往外取只能放在Object物件裡。使用下界<? super Fruit>會使從盤子裡取東西的get( )方法部分失效,只能存放到Object物件裡。set( )方法正常。

Plate<? super Fruit> p=new Plate<Fruit>(new Fruit());

//存入元素正常

p.set(new Fruit());

p.set(new Apple());

//讀取出來的東西只能存放在Object類裡。

Apple newFruit3=p.get();    //Error

Fruit newFruit1
=p.get(); //Error Object newFruit2=p.get();

五、PECS原則

最後看一下什麼是PECS(Producer Extends Consumer Super)原則,已經很好理解了:

① 頻繁往外讀取內容的,適合用上界Extends。
② 經常往裡插入的,適合用下界Super。

注:本片內容彙總來源於網路各位博主的總結,對他們表示感謝,如果問題還望指正!