? super T和? extends T的區別和應用
阿新 • • 發佈:2018-12-08
經常看見框架很多這樣的泛型寫法<? extends T>,後來終於看了相關資料才明白。
<? extends T>是指“上界萬用字元”,<? super T>是指下界萬用字元。
比較有趣,而且有點燒腦,歸根結底,還是一個上下轉型的問題。
舉例:有3個類,animal(動物),cat(貓),dog(狗)。貓和狗都繼承動物類
<? extends T>: 如果以下賦值合法: //編譯器會報錯,new
ArrayList
需要指定型別
List<?
extends
Animal> f = new
ArrayList<?
extends
Animal>();
那麼,能存放什麼型別呢,有可能是貓,也可能是狗。
唯一可確認的就是讀取出來,是一個動物或者它的子型別。
引申出---可以讀取動物的任意子類
<? super T> 可以正常存入,
List<? super Animal> b = new ArrayList<>();
b.add(new Cat());
b.add(new Dog());
for (Object o : b) {
System.out.println(o);
}
但是獲取的時候,只能是物件,因為可能是貓類,也可能是狗類。
引申出---可以存入動物的任意子類
所以,搭配使用,也就是
PECS(Producer Extends Consumer Super)原則,已經很好理解了:
- 頻繁往外讀取內容的,適合用上界Extends。
- 經常往裡插入的,適合用下界Super。