1.通配符
泛型通配符有兩種
上界通配符<? extends xx>
下界通配符<? super xx>
2.舉例說明
先上代碼吧
class A{
}
class B extends A{
}
class C extends A{
}
public class NonCovariantGenerics {
public static void main(String[] args) {
List<? extends A> list1= new ArrayList<B>();
List<? super B> list2= new ArrayList<B>();
//list1.add(new B()); 編譯出錯
list2.add(new B());
}
public static <T> void f1(List<T> list,T item) {
list.add(item);
}
}
結構很簡單的類,B和C都繼承基類A.
<? extends A>的意思表示某一個類,這個類是繼承自A,确定了上界,但是問題就來了,繼承A的類有B和C,編譯器無法确定具體的子類型,是以編譯出錯.
<? super B>表示某一個類,這個類是B的父類(超類),确定了下界,也就是說,<? super B>表示B,A以及B的其他父類(java隻有單繼承,這裡隻是舉例),雖然不确定是具體的哪一個父類,但是<? super B> 包含了B,是以編譯不出錯.
3.總結
讀取用 extends
寫入用super
(拓展)PESC 原則(Producer Extends Consumer Super)