cannot cast 'java.lang.Integer' to 'java.lang.Double' 的報錯-java的強制類型轉換和包裝類


 

 

第一個紅框可以成功運行,並且輸出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)

 

注意點:在定義集合的時候如果沒有強調泛型,在返回的結果進行類型轉換的話,很可能會報錯。推薦使用包裝類型之間的轉換。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM