List<Object> myList = new ArrayList<String>(); //(hint: no)
Map<Integer> myMap = new HashMap<int>(); // (hint: also no)
爲什麼上述聲明中的陳述錯誤?爲什麼這些在Java中無效?
List<Object> myList = new ArrayList<String>(); //(hint: no)
Map<Integer> myMap = new HashMap<int>(); // (hint: also no)
爲什麼上述聲明中的陳述錯誤?爲什麼這些在Java中無效?
我們來看第一個例子。考慮您應該能夠在List<Object>
上執行的操作:添加,刪除,檢索任何對象。
您試圖用一個集合來填充這些需求,您可以添加,刪除和僅檢索字符串。
List<Object> myList = new ArrayList<String>();
// This should be valid based on the List<Object> interface but obviously
// MyClass isn't String...so what would the statement do?
myList.add(new MyClass());
第二個原因是因爲Java中的泛型不支持原始類型。欲瞭解更多信息,你可以檢查出:對第二個例子地圖
第一個是不可能的。您可以使用通配符:
List<?> myList = new ArrayList<String>();
但現在,您的列表完全無法使用。添加,刪除等不會再編譯:
myList.add(new Object()); // Error
myList.add("error"); // Error
不能使用原語(int
,double
,....)與仿製藥。你必須使用包裝類:
HashMap<Integer> myHap = new HashMap<Integer>();
這是第一個,因爲Java泛型不是協變。所以你甚至不能這樣做:
ArrayList<Object> myList = new ArrayList<String>();
欲瞭解更多信息,請參閱此文章:Java theory and practice: Generics gotchas。
對於第二個,您不能使用基元作爲泛型類型。
1)如果有人向myList引用的列表添加Long,會發生什麼?
2)你不能有一個原始的。
有2個通用參數鍵和值,但下面還是不會工作
Map<Integer,Object> myMap = new HashMap<int,Object>();
,由於前原作爲所述類型不能用於java泛型(除了泛型類型總是從Object派生並且類型擦除將所有泛型變量轉換爲Object類型)
對於Java泛型的所有內容,請參閱Angelika Langer。在這種情況下,Is List<Object> a supertype of List<String>?
儘管Java確實支持自動裝箱,但它不會自動將<int>
轉換爲<Integer>
。海事組織這部分是爲了提醒用戶你可以得到空值。