取自https://stackoverflow.com/a/19231762/1498827
public class Test {
public class A {}
public class B extends A {}
public class C extends B {}
public void testContraVariance(List<? super B> myBlist) {
B b = new B();
C c = new C();
myBlist.add(b);
myBlist.add(c);
A a = myBlist.get(0); // does not compile
}
}
如果 myBlist 接受超型別 B ,這意味著 B 或向上,那么為什么你還可以像 in 一樣向它添加一個孩子myBlist.add(c)?
uj5u.com熱心網友回復:
我認為這個問題具體是關于List<? super B>. OP 寫了“myBlist接受 ... B 或以上”,我認為這是誤解的根源。List<? super B>并不意味著一個串列只能包含 typeB或 的超型別的元素B。
相反,List<? super B>是一個串列,其型別引數是B或是 的超型別B。鑒于問題中的型別層次結構和此宣告:
public void testContraVariance(List<? super B> myBlist)
thenmyBlist可以是 a List<B>、 aList<A>或 a List<Object>。這些型別中的任何一個都可以包含一個C. 這就是為什么myBlist.add(c)有效。
uj5u.com熱心網友回復:
每個C is-a B。您應該對將 的實體分配給C型別變數的概念感到滿意B:
B c = new C();
從那里開始,這是有效的也就不足為奇了:
List<? super B> myBlist = new ArrayList<Object>();
myBlist.add(c);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510443.html
標籤:爪哇仿制药收藏品
下一篇:只寫集合的意義何在?
