java 小问题,关于集合类的

来源:百度知道 编辑:UC知道 时间:2024/06/27 04:57:11
import java.util.*;
public class Text
{
public static void append(List list)
{
list.add("0042");
}
public static void main(String[] agrs)
{
List<Integer> intList = new ArrayList<Integer>();
append(intList);
System.out.println(intList.get(0));
}
}
为什么输出的是0042?
“0042”应该是String的
但是List<Integer> intList 这里要求的是Integer的,请各位高手指点

因为
public static void append(List list)
{
list.add("0042");
}

其中的List并非泛型接口.因此在接受List<integer>时,使得intList所指向的对象相当于进入了一个黑盒中,list和intList指向的同一段内存空间,intList因为受到泛型约束,因此只能添加Integer类型的对象,但是list不用考虑这些.

因为List的默认元素类型是Object,因此放入任何类型都可以.String也可以,Integer也行...

但是如果有下列代码却也不会报错
List<Integer> intList = new ArrayList<Integer>();
append(intList);
Integer i = intList.get(0);//不会提示错误或者警告
但是在运行时则会报错,提示String类型不能转化为Integer对象
java.lang.String cannot be cast to java.lang.Integer

这个例子的用意在于表述非泛型类和非泛型接口是不安全的,尽量不要使用非泛型类和接口...

代码可以改为
public static void append(List<Integer> list) {
list.add("0042");//会提示错误
}

首先在append方法的参数中没有使用泛型,字符串是可以加到list的
其次泛型信息在运行时会被擦除,所以intList.get(0)取出的就是一个Object,具体类型是String,你只是打印所以没出错
如果Integer i = intList.get(0);这样就会出现ClassCastException

你试下把你的append(List<Integer> list)改成这样,你再传递字符串就会出错了.