Java中的列表与数组

数组协变的,所谓协变是指如果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<Object> objList = new ArrayList<String>(); //编译错误: 不兼容的类型: ArrayList<String>无法转换为List<Object>

复制代码

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

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

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

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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值