sqlserver的timestamp怎么转string_你连存活到JDK8中著名的Bug都不知道,我怎么敢给你加薪...

aa4a82369f3f4c3a715490cdc98e4eaf.png

1、背景

在笔者研究 JDK 源码时,注意到在CopyOnWriteArrayList 和ArrayList 的构造器中都出现了如下 bug 字样

37b560cd5c5feaba5c988a67469c9b44.png

9c929863a38fa4b1e895acf81bac36e6.png

6260652 其实代表的JDK bug 列表中的编号

  • http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6260652
  • http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6515694

上面两个 bug 其实是同一个问题。那他到底意味着什么呢,JDK 居然将此 bug 留在 8 了还没处理?

看几个例子:

2、案例

2.1 案例一

package com.javaedge;
 
public class Test {
    public static void main(String[] args) {
        Child[] childArray = {new Child(), new Child()};
        System.out.println(childArray.getClass());
 
        Father[] fatherArray = childArray;
        System.out.println(fatherArray.getClass());
 
        // ArrayStoreException
        fatherArray[0] = new Father();
    }
}

父类数组中每一个元素都是子类对象,所以如下所示,这种向上转型不会报错

05e53de11d14b6f2f04c51a51b5993b5.png

允许子类数组转换成父类数组。

但数组中元素类型都是Child型,所以如下所示,会报错!!!

ed60ed0e7a459825cda9b3472ad11210.png

java.lang.ArrayStoreException表明已经尝试作出了错误类型的对象存储到对象的数组。

例如,下面的代码生成一个ArrayStoreException

e11d662adc0d318d9e572702492b479f.png

这意味着Object[]数组,并不表示可以随便将一个Object对象放进去,而取决于数组中元素的实际类型。

2.2 案例二

9bf6a4be46216321ceeb7d77a3dce5d4.png

List<String> list = Arrays.asList("JavaEdge"); // 返回的类型是java.util.Arrays$ArrayList,而不是ArrayList

Object[] objects = list.toArray(); // 返回String[]数组
所以我们不能将Object对象,放到objects数组。

2.3 案例三

e52ecba0ecd3e46bef4a6835dcaece95.png

ArrayList的toArray()返回Object[]数组,所以可将任意对象存入 list2Array 数组。

3、总结

通过案例二和三可以得出结论:

对于

List<String> stringList

当调用

Object[] objectArray = stringList.toArray()

objectArray 实际上并不一定是Object[]类型,也就不能随便放进一个对象。

所以开头中的源码都有注释说明:

c.toArray might (incorrectly) not return Object[] (see 6260652)。

通过if判断,避免错误的数组类型存储异常。

Arrays.copyOf(elementData, size, Object[].class)

即可确保创建得到Object[]数组,因此可以存任意类型对象。


作者:JavaEdge
链接: https:// blog.csdn.net/qq_335895 10/article/details/104767849?utm_medium=distribute.pc_feed.none-task-blog-alirecmd-6.nonecase&depth_1-utm_source=distribute.pc_feed.none-task-blog-alirecmd-6.nonecase&request_id=
来源:CSDN
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值