2013-05-15 59 views
1

嗨,我使用addAll方法的集合框架。請在下面找到我的代碼。它對代碼1工作正常。對於代碼2,它給我編譯錯誤。我不知道爲什麼它沒有給我錯誤代碼1.請給出原因。需要澄清addAll方法的行爲

代碼1

public static void main(String[] args) { 
    List<Integer> firstList=new ArrayList<Integer>(); 
    List secondList=new ArrayList();      //without generic 

    secondList.add("string value"); 

    firstList.addAll(secondList); 
    System.out.println(firstList); 

} 

輸出:

[string value] 

代碼2

  public static void main(String[] args) { 
    List<Integer> firstList=new ArrayList<Integer>(); 
    List<String> secondList=new ArrayList<String>();  //with generic 

    secondList.add("string value"); 

    firstList.addAll(secondList); 
    System.out.println(firstList); 

} 

輸出

 compilation error 
+1

您嘗試添加字符串列表爲整數列表,這是不可能的。這是泛型的最佳使用,在編譯時間本身期間,您會將此錯誤視爲錯誤。 –

+1

您正在使用示例一中的原始類型。你可以添加任何東西到這個列表中,但是在get()它們時不能對元素類型做任何假設。它本質上是不安全的。 – jlordo

回答

1

在編譯時檢查Java Generics。意味着編譯器可以檢查通用列表,並且如果字符串ListInteger,則可以顯示錯誤。在第一種情況下。它是編譯器在編譯時無法判斷的non-generic
也瞭解Type Erasure

0
firstList.addAll(secondList); 

firstList是字符串類型

secondList是類型號碼

在第一示例中使用的是原始類型,但在第二您使用泛型(指定的列表爲字符串)

如果使用原始列表,它將在運行時完成

0
List secondList=new ArrayList();      //without generic 

這意味着List<Object> secondList=new ArrayList<Object>();所以你可以任意添加對象。

但是,如果你明確提到很顯然,你不能添加字符串到整數列表,在你的第二個案件類型

0

你正試圖從String桶中添加的所有值是專門分配一斗爲Integer

你可以這樣做

ArrayList commonList =new ArrayList(); // for all objects 
List<String> stringList =new ArrayList<String>();   
List<Integer> integerList =new ArrayList<Integer>();  
stringList.add("string value"); 
integerList.add(1); 
commonList .addAll(stringList); 
commonList .addAll(integerList); 
System.out.println(commonList);