泛型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。
注:本片內容彙總來源於網路各位博主的總結,對他們表示感謝,如果問題還望指正!