Java 需要澄清addAll方法的行为吗

Java 需要澄清addAll方法的行为吗,java,list,collections,arraylist,Java,List,Collections,Arraylist,嗨,我正在使用集合框架的addAll方法。请在下面找到我的代码。对于代码1,它可以正常工作。对于代码2,它给了我编译错误。我不知道为什么它没有给我代码1的错误。请说明原因 代码1 public static void main(String[] args) { List<Integer> firstList=new ArrayList<Integer>(); List secondList=new ArrayList();

嗨,我正在使用集合框架的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);

}
代码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);

}
firstList
是字符串的类型

secondList
是数字的类型

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

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

firstList
是字符串的类型

secondList
是数字的类型

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


如果您在编译时使用泛型检查donet。如果您使用原始列表,它将在运行时完成。Java
泛型将在编译时检查。意味着编译器可以检查泛型列表,并且如果字符串
list
Integer
,则编译器可以显示错误。而在第一种情况下。它是非泛型的,编译器在编译时无法判断。

还可以阅读有关编译时检查Java
泛型的
类型擦除的信息。意味着编译器可以检查泛型列表,并且如果字符串
list
Integer
,则编译器可以显示错误。而在第一种情况下。它是非泛型的,编译器在编译时无法判断。
List secondList=new ArrayList();                        //without generic
另请阅读有关类型擦除的信息

List secondList=new ArrayList();                        //without generic
意思是
List secondList=new ArrayList()这样您就可以将任何对象添加到此

但如果您明确地提到类型,那么很明显,在第二种情况下,您不能将字符串添加到整数列表中

意思是
List secondList=new ArrayList()这样您就可以将任何对象添加到此


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

您试图将
字符串
bucket中的所有值添加到专门为
整数
分配的bucket中

你可以这样做

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 );
ArrayList commonList=新建ArrayList();//对于所有对象
List stringList=新建ArrayList();
List integerList=new ArrayList();
添加(“字符串值”);
整数列表。添加(1);
commonList.addAll(stringList);
commonList.addAll(整数列表);
System.out.println(commonList);

您正在尝试将
字符串
bucket中的所有值添加到专门为
整数
分配的bucket中

你可以这样做

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 );
ArrayList commonList=新建ArrayList();//对于所有对象
List stringList=新建ArrayList();
List integerList=new ArrayList();
添加(“字符串值”);
整数列表。添加(1);
commonList.addAll(stringList);
commonList.addAll(整数列表);
System.out.println(commonList);

您试图将字符串列表添加到整数列表中,这是不可能的。这是泛型的最佳使用,在编译期间,这种不匹配将作为错误出现。在示例1中,您使用的是原始类型。您可以向该列表中添加任何内容,但在
get()
ting元素时,不能对元素类型做出任何假设。它本质上是类型不安全的。您试图将字符串列表添加到整数列表中,这是不可能的。这是泛型的最佳使用,在编译期间,这种不匹配将作为错误出现。在示例1中,您使用的是原始类型。您可以向该列表中添加任何内容,但在
get()
ting元素时,不能对元素类型做出任何假设。它本质上是不安全的。
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 );