Java的類型通配符,能夠出如今類、方法上面。最經常使用的方式就是集合類,例如List,Set等類上面。java
本文主要討論的是最後的關於邊界的通配符類型。數組
public static void main(String[] args) { List<B> bList = new ArrayList(); bList.add(new A()); bList.add(new B()); bList.add(new C()); A a3 = bList.get(0); B b3 = bList.get(0); C C3 = bList.get(0); List<? extends B> bExtends = new ArrayList(); bExtends.add(new A()); bExtends.add(new B()); bExtends.add(new C()); A a1 = bExtends.get(0); B b1 = bExtends.get(0); C C1 = bExtends.get(0); List<? super B> bSuper = new ArrayList(); bSuper.add(new A()); bSuper.add(new B()); bSuper.add(new C()); A a2 = bSuper.get(0); B b2 = bSuper.get(0); C C2 = bSuper.get(0); } } class A { String a = "a"; } class B extends A { String b = "b"; } class C extends B { String c = "c"; }
有三個類,繼承關係是A < B < C。
而後聲明瞭三個數組,list,extends,super.
上面的代碼是編譯不經過的。分別在第三、七、11-1三、1六、1九、22-24行。安全
List<? extends B> 獲得的是B及B的子類的一個集合。
List<? super B> 獲得的是B及B的父類的一個集合。
List 獲得的是一個B的集合。code
按照第1條解釋,第三、11-13行的錯誤符合解釋。
按照第2條解釋,第1九、22-24行的錯誤符合解釋。
第七、16行是因爲向下轉型是不安全的,股編譯錯誤。繼承
extends和super別定義了上下限,結論以下面的表格get
extends | super | T | |
---|---|---|---|
add | unsafe | safe | safe |
get | safe | unsafe | safe |