1. 程式人生 > >? super T和? extends T的區別和應用

? super T和? extends T的區別和應用

經常看見框架很多這樣的泛型寫法<? 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。