第一個紅框可以成功運行,並且輸出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)
注意點:在定義集合的時候如果沒有強調泛型,在返回的結果進行類型轉換的話,很可能會報錯。推薦使用包裝類型之間的轉換。