创建泛型数组非法的原因
2016-03-13 16:43
357 查看
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>成功。
相关文章推荐
- 一个轻量级分布式RPC框架--NettyRpc
- 单元测试
- 按Right-BICEP要求的任务二的测试
- 构建之法阅读笔记01
- 2152: 聪聪可可|树形DP
- Audio 和Looper的交集
- LAMP 架构深度优化记录
- LINK : fatal error LNK1168: cannot open Debug/Test.exe for writing的解决方法
- BZOJ_P2599 [IOI2011]Race(点分治)
- 蓝桥杯 幸运数
- LinkIt Assist 2502开发笔记4: 样例程序解释
- C#基础之委托
- 按照Right-BICEP要求对实验二进行测试
- 学习进度表第二周
- 数据结构与算法面试题80道(26)
- codeforces_632C.The Smallest String Concatenation(string)
- Linux内核学习方法
- 191. Number of 1 Bits
- Swift-网络、本地数据解析
- 实验说明JSP中include指令和include动作指令的区别