博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中的列表与数组
阅读量:7075 次
发布时间:2019-06-28

本文共 1162 字,大约阅读时间需要 3 分钟。

数组协变的,所谓协变是指如果Sub是Super的子类,那么Sub[]是Super[]的子类,但这在列表中是不成立的。协变是有缺陷的,或者说有风险的。例如:

//数组协变的缺陷Object[] objs = new String[10];objs[0] = new String[5];//RunTimeException: ArrayStoreException: [Ljava.lang.String;String first = (String)objs[0];//List不支持协变List objList = new ArrayList
(); //编译错误: 不兼容的类型: ArrayList
无法转换为List
复制代码

因此,一般而言,能使用List则使用List,尽量避免使用数组。

Java不支持创建泛型,谈到这儿,就得扯到泛型擦除机制了。假设数组支持泛型,那么因为数组的协变特性,在编译期间编译器无法进行类型检查,而在运行期,泛型类型被擦除。例如在运行期,下面三个变量都是List类型。

List
strList = new ArrayList<>();List
intList = new ArrayList<>();List orgList = new ArrayList();复制代码

如果,数组支持泛型,那么下面的代码就会成立,但runtime时则抛出类型错误。

Object[] objs = new ArrayList
()[10]; //假设数组支持泛型objs[0] = new ArrayList
();//编译器被骗,不知道有类型错误复制代码

所以说,为了保证Java的类型安全,是不支持创建泛型数组的。

注意:上文提到的只是不支持创建泛型数组,但并没有限制声明泛型数组。例如下面这条语句就是合法的。

//创建原始类型数组,然后强转,合法语句ArrayList
[] obj = (ArrayList
[])new ArrayList[10];obj[0] = new ArrayList<>();//添加一个ArrayList
对象,合法语句obj[1] = new ArrayList
();//编译错误:不兼容的类型。复制代码

转载于:https://juejin.im/post/5b4d71e65188251ac9767a3a

你可能感兴趣的文章
【转】Navigation Drawer(导航抽屉)
查看>>
Linux Shell常用技巧(十)
查看>>
【从零之三(更)】自定义类中调用讯飞语音包错误解决办法
查看>>
【源代码】LinkedHashMap源代码剖析
查看>>
Android InputStream转Bitmap
查看>>
记录水电系统开发的心理【1】
查看>>
【Html5】-- 塔台管制
查看>>
WiFi万能钥匙蹭网原理详细剖析
查看>>
浅谈JavaScript中的继承
查看>>
蜂鸟运单系统架构及实现
查看>>
Lambda表达式(Java)
查看>>
Docker Registry Server 搭建,配置免费HTTPS证书,及拥有权限认证、TLS 的私有仓库
查看>>
Java 8 并发篇 - 冷静分析 Synchronized(上)
查看>>
在 Node.js 中检测端口 port 是否被占用
查看>>
swift基础学习(九)
查看>>
MPAndroidChart绘制曲线图、柱状图总结
查看>>
我的Java设计模式-中介者模式
查看>>
EasyBarrage——Android平台轻量级弹幕效果
查看>>
SpringBoot高级篇Redis之String数据结构的读写
查看>>
花了 4 个月整理了 50 篇 Android 干货文章
查看>>