採取以下代碼:約泛型奇怪的行爲,我
public class Main {
public static void main(String[] args) {
List<Object> list1 = new ArrayList<Object>();
List<? super Integer> list2 = list1;
list2.add(1);
list1.add("two");
//list2.add("three"); // will never compile!!.
System.out.println("list1: " + list1.toString());
System.out.println("list2: " + list2.toString());
}
}
這裏是輸出:
list1: [1, two]
list2: [1, two]
,一方面,列表2不允許在對象的add()方法像弦「三」;但另一方面,它引用一個包含對象的列表。
你能澄清一下實際問題是什麼嗎?我假設它是這樣的:「當list2的類型是'?super Integer'時,list2似乎包含一個字符串(在print語句中),特別是給它添加一個字符串爲list2.add(」three「) '不會編譯?「但你真正給出的只是一個觀察。 – alexroussos
你擁有的是一個有效的賦值列表,如果你不考慮它被處理的序列,那麼這個賦值可能看起來很奇怪。在你指定'list2 = list1'時,它是完全有效的,即使在稍後的點你可以通過'list1.add(「three」)添加新條目(因爲它們實際上是一個單獨的列表);'沒有什麼奇怪和不尋常的關於它 –