2013-09-23 51 views
0

考慮通配符超

List<? super Integer> lst= new ArrayList<Number>(); 
lst.add(new Integer(3)); //ok- why?? I expected compile error "expected add(int, Object), found add(int,CAP#1)" 
lst.get(0); //ok 

List <? extends Number> nums= new ArrayList<Integer>(); 
lst.add(new Integer(3));//Compile error- expected add(int, Object), found add(int,CAP#1) 

在我們不知道類型的<? extends Number>,並有編譯錯誤編譯狀態。我們知道關於編譯狀態的類型<? super Integer>嗎?爲什麼?

回答

2

當然 - 你知道無論通配符的值是多少,它都是Integer的超類(根據定義,從邊界開始)。所以不管它的具體類是什麼,你都有一個可以容納Integer的東西。在這種情況下,A List<Object>List<Number>的作用與List<Integer>一樣好。

隨着延伸然而,這是一個不同的故事。 A List<? extends Number>可能是List<Double>,所以很顯然Integer不能插入到此列表中而不會違反類型安全性。 (實際上,除了null-因此,除此之外什麼都不能插入。)

+0

好的,謝謝。現在我不明白什麼不同'List <? super Integer> lst = new ArrayList ();'from'List lst = new ArrayList ();'? –

+0

@ St.Antario這兩條線都涉及兩件事情。 *首先*,你定義一個名爲'lst'的變量,並說出它是什麼類型。 *然後*,您構造一個對象並將其分配給此變量。對象的實際類型和變量的聲明類型可能不同。比較'對象a =「hello」;'vs'String b =「hello」;',如果有幫助的話。實際的字符串在兩種情況下都是相同的,但是您不能調用'a.length()',因爲唯一保證您具有'a'中的內容的是它是'Object'。 –