2015-01-12 86 views
0

的一個示例它由java製成,泛型不會自動從Generic<A>轉換爲Generic<SupeclassOfA>列表<?>與列表<Object>不相同

例如,如果寫一個方法

public static void printList(List<Object> list) { 
    for (Object elem : list) 
     System.out.println(elem + " "); 
    System.out.println(); 
} 

它不會接受List<Integer>。我需要重寫List<?>的頭文件,它將開始工作,但代碼將會相同。

那麼,爲什麼這樣做?

假設我重新設計了Java,因此List<?>總是表示與List<Object>相同。我會面對什麼問題?

+1

嘗試添加到列表中的東西。 –

+0

這個問題在很多方面都被問過幾十次。請先搜索現有問題。 –

回答

1

假設採取List<Object>接受List<Integer>的方法。這意味着List<Integer>List<Object>的子類型。如果這是真的,你可以這樣做:

List<Integer> intList = new ArrayList<Integer>(); 
List<Object> objList = (List<Object>) intList; 
objList.add("foo"); 
int a = intList.get(0); // This would fail at runtime because intList.get(0) is a String. 

所以,如果你能投了List<Integer>List<Object>你就失去了編譯時類型安全的安全泛型提供。

List<?>List<Object>不一樣。 List<?>是某種未知類型的List。由於T未知,因此無法向List<?>添加任何內容(null除外)。這與您可以添加任何內容的List<Object>完全相反。

作爲一般規則,List<Object>是你很少需要的。大多數情況下,您需要一個List,其中所有項目具有相同的類型,如List<Integer>List<String>。如果您正在編寫一個類型不重要的方法,例如只打印項目的示例,則參數應該有類型List<?>

0

你也可以聲明一個上限。所以你說:

List<? extends Foo> list 

這將導致你只能夠在列表中的東西是foo的子類。在你的案例中寫入 擴展Object。所以Integer是一個可以插入的子類。