对JAVA不支持泛型数组原因的猜测。

下列代码可通过编译,第5句在运行时,JVM发现objArray实际上是String引用类型的数组,所以不能指向Integer对象所以会抛出异常:throws ArrayStoreException at runtime

1 String[] strArray = new String[10];
2 Integer[] intArray = new Integer[10];
3 intArray[0]=1;
4 Object[] objArray = strArray;//数组向上转型
5 objArray[0] =intArray[0] ; // 子类对象,赋值给Objecty引用。
6 String str=strArray[0];

假设JAVA 允许泛型数组,则下列语句均可通过编译。
与普通数组的差别是,运行第5句时由于“类型擦除”的缘故使得JVM认为Test<String>[] 和Test<Integer>[]同为Test[]即strList[0]与intList[0]所指向的类型均为Test,所以x[0] = intList[0]成立,并不会抛出异常,当运行到第6句时才因Integer不能直接转换为String抛出型转换异常

1 Test<String>[] strList = new Test<String>[10];
2 Test<Integer>[] intList = new Test<Integer>[10];
3 intList[0]=new Test<Integer>();intList[0].set(11);
4 Object[] x = strList; //数组向上转型
5 x[0] = intList[0];//与普通数组同理,编译器无法检测出问题,因为X[0]是一个Object引用
6 String str = strList[0].getValue();//同样,编译器也看不出来从Test<String>里去取出String会出现问题。

我们知道JAVA的泛型是为了在编译期就检测出类型转换问题,避免运行时出现错误抛出异常,从而提高安全性的一组编程者与编译器的约定。
但是如果支持泛型数组,根据以上代码就会发现,类型转换的安全问题不但没有被解决,还藏的更深了。原本在运行时第5句就能被抛出的问题被延后到了第6句,使问题更难以被发现和解决。
如果有错误请帮忙指出。Thanks♪(・ω・)ノ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值