Java 需要澄清addAll方法的行为吗
嗨,我正在使用集合框架的addAll方法。请在下面找到我的代码。对于代码1,它可以正常工作。对于代码2,它给了我编译错误。我不知道为什么它没有给我代码1的错误。请说明原因 代码1Java 需要澄清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();
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 );