第一个红框可以成功运行,并且输出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)

 

注意点:在定义集合的时候如果没有强调泛型,在返回的结果进行类型转换的话,很可能会报错。推荐使用包装类型之间的转换。