第一个红框可以成功运行,并且输出3
第二个红框报错 Integer can't cast to double
抛出疑问
1.红框1 会进行自动拆箱,为什么红框2,在list取出Integer类型后就不会自动拆箱?
解答:因为我没有定义list的泛型,所以list取出的是Object类型,Object怎么会自动拆箱或者装箱呢?
2.如果list取出的是Object类型,为什么是报错 Integer can't cast to double 而不是 Object can’t cast to double?
解答如下:
先分析第一个红框执行过程
1.Integer.getValueOf();取得值
疑惑:什么时候会触发Integer.getValueOf()?
2.(double)int进行强制转换
现在分析第二个红框的执行过程
1.因为我在初始化List的时候并没有定义泛型的类型,所以返回的结果(list.get())是Object类型
2.Object强转成double失败报错 Integer can't cast to double,而不是Object can't cast to double的原因:
例如3存入list中,会被自动装箱成Integer类型,但是!!!是以Object引用的Integer对象,类似这种形式:Object o=new Integer("3");
这个是多态的一种体现。
看下面的例子,就可以发现,虽然是用Object类型引用,但是他的根本还是Integer类型!!!:
所以报错的形式 估计是: A.getClass() can't cast to B.getClass(); 所以报错是Integer can't cast to Double(但是实际上是Object不能转换为double)
解决方法:
1.在定义List的时候加上泛型的定义,例如 List<Integer> list=new ArrayList();
这样在get返回的结果就是对应的泛型。
(double)Integer会执行两步操作:
1.Integer.getValue();
2.强制类型转换
2.使用 Double.valueOf(String)
注意点:在定义集合的时候如果没有强调泛型,在返回的结果进行类型转换的话,很可能会报错。推荐使用包装类型之间的转换。