创建泛型数组非法的原因

List<String>[] stringLists = new List<String>[1];
List<Integer> intList = Arrays.asList(42);
Object[] objects =  stringLists;
objects[0] = intList;
String s = stringList[0].get(0);
首先假设泛型数组合法,则第一行不会出现编译错误;

第一行和第二行都很容易理解,现在看第三行,可以看出这出现了多态,编译时objects是Object[]类型,运行时是List<String>[] 类型;

第四行里,编译的时候,将一个List<Integer>类型的引用赋给Object是没有问题的,因为泛型也是Object对象。而对于运行时,objects的类型是List<String>[],

同时因为泛型在运行时会进行擦除(List<Integer>变成List,List<String>[] 变成List[]),所以第四行可以看成是将一个List对象赋给一个List[]对象,所以运行时也不会出现问题;

现在看第五行,由于List<E>对象调用get(int i)返回的是E,所以List<String>.get(0)返回的是String并赋给String,所以编译时不会有错误。

但运行时get()返回的是一个Integer,将它赋给String就会出现ClassCastException;

泛型保证编译不出错就不会运行时出错,而泛型数组打破了这种诺言,所以泛型数组不合法;


可能有人会说,上面的代码为什么不写成下面这种,为什么要声明一个Object[]:

List<String>[] stringLists = new List<String>[1];
List<Integer> intList = Arrays.asList(42);
stringLists[0] = intList;
String s = stringList[0].get(0);
要是这样的话,编译时在第三行处就会因为将一个List<Integer>赋给一个List<String>出现编译错误,这样就通过编译了;

所以可以看出,Object[]的存在就是为了利用多态的性质使得将一个List<Integer>赋给一个List<String>成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值