为什么<integer> ArrayList添加一个字符串变量并成功编译?</integer>

时间:2015-01-09 16:13:32

标签: java arraylist

我很困惑为什么Integer类型的Arraylist能够为它添加一个String。如下所示,&#34;(&#34; 0067&#34;)&#34;添加到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");
}
}

3 个答案:

答案 0 :(得分:4)

查看方法签名:

public static void addToList(List list)

listraw 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)

你将得到一个错误的编译时间。