Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么<;整数>;ArrayList是否添加字符串变量并成功编译?_Java_Arraylist - Fatal编程技术网

Java 为什么<;整数>;ArrayList是否添加字符串变量并成功编译?

Java 为什么<;整数>;ArrayList是否添加字符串变量并成功编译?,java,arraylist,Java,Arraylist,对于整型Arraylist为什么能够向其中添加字符串,我感到非常困惑。如下所示,addtolist(list list)方法中的列表中添加了“(“0067”)”,由于它是一个字符串,代码应该抛出一个错误,但不会。有人能解释为什么这段代码能成功运行吗 //test program import java.util.ArrayList; import java.util.List; public class listing { public static void main(Str

对于整型Arraylist为什么能够向其中添加字符串,我感到非常困惑。如下所示,addtolist(list list)方法中的列表中添加了“(“0067”)”,由于它是一个字符串,代码应该抛出一个错误,但不会。有人能解释为什么这段代码能成功运行吗

//test program    


import java.util.ArrayList;
import java.util.List;

public class listing {


public static void main(String[] args) {
    List<Integer> lst = new ArrayList<Integer>();

    addToList(lst);

    System.out.println(lst.get(0));
}

public static void addToList(List list) {
    list.add("0067");
}
}
//测试程序
导入java.util.ArrayList;
导入java.util.List;
公共类列表{
公共静态void main(字符串[]args){
List lst=new ArrayList();
地址列表(lst);
System.out.println(lst.get(0));
}
公共静态无效添加列表(列表){
列表。添加(“0067”);
}
}

查看方法签名:

public static void addToList(List list)
列表
是一个列表,启用警告应该会向您发出如下警告:

列表是原始类型。对泛型类型列表的引用应参数化

要在编译时进行更强的类型检查,需要将其更改为:

public static void addToList(List<Integer> list)
publicstaticvoidaddtolist(列表)

查看方法签名:

public static void addToList(List list)
列表
是一个列表,启用警告应该会向您发出如下警告:

列表是原始类型。对泛型类型列表的引用应参数化

要在编译时进行更强的类型检查,需要将其更改为:

public static void addToList(List<Integer> list)
publicstaticvoidaddtolist(列表)

addToList()
中列表的参数类型不是泛型的。这意味着在该方法中,您可以向该列表添加任何对象,而不会产生编译器错误,因为只检查参数的泛型类型,而不检查传递的列表的泛型类型

现在,为什么这段代码在运行时也可以工作?编译时,泛型类型信息被擦除。因此,基本上每个列表在运行时都是一个
列表。如果您在记住这一点的同时再次查看代码,您将看到它是有效的。也因为有

如果您添加

Integer foo = lst.get(0);

addToList()
中列表的参数类型不是泛型。这意味着在该方法中,您可以向该列表添加任何对象,而不会产生编译器错误,因为只检查参数的泛型类型,而不检查传递的列表的泛型类型

现在,为什么这段代码在运行时也可以工作?编译时,泛型类型信息被擦除。因此,基本上每个列表在运行时都是一个
列表。如果您在记住这一点的同时再次查看代码,您将看到它是有效的。也因为有

如果您添加

Integer foo = lst.get(0);
在代码中

public static void addToList(List list) 
您不会收到编译器警告,因为参数列表不是泛型的。这意味着它相当于
列表
。在第一次尝试将元素插入列表时,运行时会出现错误

换成

public static void addToList(List<Integer> list)
publicstaticvoidaddtolist(列表)
您将在代码中得到编译时错误。

public static void addToList(List list) 
您不会收到编译器警告,因为参数列表不是泛型的。这意味着它相当于
列表
。在第一次尝试将元素插入列表时,运行时会出现错误

换成

public static void addToList(List<Integer> list)
publicstaticvoidaddtolist(列表)

您将得到一个编译时错误。

发表评论。不要编辑问题。但是,这将生成一个编译器,警告问题是您的
addToList()
方法。您有
addToList(列表)
,您应该有
addToList(列表)
。您没有在方法中指定类型。请发表评论。不要编辑问题。但是,这将生成一个编译器,警告问题是您的
addToList()
方法。您有
addToList(列表)
,您应该有
addToList(列表)
。您没有在方法中指定类型。