我很困惑为什么Integer类型的Arraylist能够为它添加一个String。如下所示,"(" 0067")"添加到addtolist(列表列表)方法的列表中,因为它是一个String,代码应该抛出错误,但它不会。任何人都可以解释为什么这个代码成功运行?
//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");
}
}
答案 0 :(得分:4)
查看方法签名:
public static void addToList(List list)
list
是raw type,启用警告时应警告您:
列表是原始类型。对泛型类型List的引用应该参数化
要在编译时进行更强大的类型检查,您需要将其更改为:
public static void addToList(List<Integer> list)
答案 1 :(得分:0)
addToList()
中列表的参数类型不是通用的。这意味着在该方法中,您可以将任何对象添加到该列表而不会产生编译器错误,因为只检查参数的泛型类型,而不是传递的列表。
现在为什么这段代码也能在运行时运行?编译通用类型信息时会被删除。所以基本上每个列表在运行时都是List<Object>
。如果您再次查看代码,同时牢记这一点,您会看到它的工作原理。还因为有a println
which takes Object
as parameter。
如果您添加了
,那么可以编译但不会运行的示例Integer foo = lst.get(0);
答案 2 :(得分:0)
在您的代码中
public static void addToList(List list)
您没有收到编译器警告,因为参数 list 不是通用的。这意味着它相当于List<Object> list
。首先尝试在列表中插入一个元素,在运行时会出现错误。
只需更改为
public static void addToList(List<Integer> list)
你将得到一个错误的编译时间。