java中泛型List问题

来源:百度知道 编辑:UC知道 时间:2024/06/03 05:03:37
问题:为什么在一个Integer的List里面插入一个String的对象读取成功而在一个String的List插入一个整数读取时抛出ClassCastException?看代码。

以下是在一个Integer的List里面插入一个String对象,读取正确。

public class IteratorTest2 {
public static void go(List list)
{
list.add("1.1");
}
public static void main(String args[])
{
List<Integer> list=new ArrayList<Integer>();
list.add(1);
go(list);
System.out.println(list.get(1));
}
}
------------------------------------------------------------

以下是在一个String的List里面插入一个整型数,读取抛出异常。

public class IteratorTest2 {
public static void go(List list)
{
list.add(1.1);
}
public static void main(String args[])
{
List<String> list=new ArrayList<String>();
list.add("1");
go(list);
System.out.println(list.get(

您好,我用断点调试解释吧[真的很高兴能与你讨论][啊啦上回不好意思但还是说对一部分滴].
1-----你在go方法中,没有给list限制泛型约束,所以1.1不加check的存储进arraylist了.

2-----"1.1"是被内部机制转换为Double存储进arraylist的:

[在System.out.println(list.get(1));处下断点,点调试.可以看到list里是
[1, 1.1],
elementData[]为
[1, 1.1, null, null, null, null, null, null, null, null].
elementData[0]的值是"1",
elementData[1]的值为Double (标识=37).]

也就是说,go方法add时因为没有约束,所以由内部机制将1.1转换为Double存入了以String为约束的list里.

3-----点"单步跳入",看到代码跳到了arraylist的get里:
public E get(int index) {
RangeCheck(index);

return elementData[index];
}
关键点就在这了,由第2步看到elementData[1]的类型为Double,而在main里为list设置的约束是String,所以E 为String.上面的代码就变为:
public String get(int index) {
RangeCheck(index);

return 1.1; //double
}
继续跳,
看到他照样返回了一个加着String标签的double值.

4-----继续点然后报错了.这个是由于syso输出是输出String.这个后面会说.

如果你加一个方法:
public static void go1(List lis