需要澄清addAll方法的行为

时间:2013-05-15 10:01:20

标签: java list collections arraylist

您好我正在使用Collection框架的addAll方法。请在下面找到我的代码。它适用于代码1.对于代码2,它给我编译错误。我不知道为什么它没有给我代码1的错误。请给出原因。

代码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

4 个答案:

答案 0 :(得分:1)

在编译时检查Java Generics。表示编译器可以检查通用列表,如果字符串ListInteger,则可以显示错误。而在第一种情况下。它是non-generic,编译器无法在编译时判断 另请阅读Type Erasure

答案 1 :(得分:0)

 firstList.addAll(secondList);

firstList是字符串的类型

secondList是数字类型

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

SEE HERE

如果在编译时使用泛型检查donet。如果使用原始列表,它将在运行时完成

答案 2 :(得分:0)

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

这意味着List<Object> secondList=new ArrayList<Object>();,因此您可以添加任何对象。

但是如果你明确提到类型,很明显你不能将字符串添加到整数列表,在你的第二种情况下

答案 3 :(得分: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 );