2011-06-08 83 views

回答

5

我們來看第一個例子。考慮您應該能夠在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中的泛型不支持原始類型。欲瞭解更多信息,你可以檢查出:對第二個例子地圖

java - Why don't Generics support primitive types?

3
  1. 第一個是不可能的。您可以使用通配符:

    List<?> myList = new ArrayList<String>(); 
    

    但現在,您的列表完全無法使用。添加,刪除等不會再編譯:

    myList.add(new Object()); // Error 
    myList.add("error");  // Error 
    
  2. 不能使用原語(intdouble,....)與仿製藥。你必須使用包裝類:

    HashMap<Integer> myHap = new HashMap<Integer>(); 
    
5

這是第一個,因爲Java泛型不是協變。所以你甚至不能這樣做:

ArrayList<Object> myList = new ArrayList<String>(); 

欲瞭解更多信息,請參閱此文章:Java theory and practice: Generics gotchas

對於第二個,您不能使用基元作爲泛型類型。

5

1)如果有人向myList引用的列表添加Long,會發生什麼?

2)你不能有一個原始的。

1

有2個通用參數鍵和值,但下面還是不會工作

Map<Integer,Object> myMap = new HashMap<int,Object>(); 

,由於前原作爲所述類型不能用於java泛型(除了泛型類型總是從Object派生並且類型擦除將所有泛型變量轉換爲Object類型)

1

對於Java泛型的所有內容,請參閱Angelika Langer。在這種情況下,Is List<Object> a supertype of List<String>?

儘管Java確實支持自動裝箱,但它不會自動將<int>轉換爲<Integer>。海事組織這部分是爲了提醒用戶你可以得到空值。