2013-02-23 77 views
3

我面臨的問題在運行時編譯這段代碼這是拋出一個錯誤,java.lang.Integer不能轉換爲Java.lang.Double。我會更樂意,如果有人幫助我改正這個代碼java.lang.ClassCastException:java.lang.Integer不能轉換爲java.lang.Double

double x; 

public Double getMethod() { 

    HashMap hashmap= new HashMap(); 

    hashmap = SumCal(); 

    List listabc = (List) hashmap.get("abclist"); 
    int total=(Integer) hashmap.get("all_total"); 
    x = (Double) listabc.get(0)*100/total; 
    return x; 
    } 
+1

這是因爲你不能將整數轉換爲雙精度。它們是兩個不同的類,而不是另一個的子類。最有可能你神祕地從listabc中獲取的元素是一個Integer。 (因爲你依賴於隱式的「拳擊」轉換,所以你將自己搞糊塗了,當你剛剛學習時就不明智了。) – 2013-02-23 02:39:29

+0

在問這樣的問題之前,請看Java中的類層次結構。 – ATrubka 2013-02-23 04:58:44

+2

公平地說,基於C語言通過對兩個基本不相關的概念(數據格式轉換和參考層次操作)使用「cast」(術語和符號)極大地混淆了這個問題。將「float」轉換爲「int」是將「Number」轉換爲「Integer」的完全不同且不相關的概念,例如。 (我不記得在教科書/參考資料中討論過這種令人困惑的二分法,或者在課堂上討論這個問題。) – 2013-02-25 02:36:34

回答

4

你可以做如下,但我會建議你Generics去。

x = ((Integer) listabc.get(0) * 100/total); 

如果你已經使用了下面的泛型,你不需要任何鑄造。

List<Integer> listabc 
HashMap<String, Integer> hashmap 
x = listabc.get(0) * 100/total; 

在這種情況下,你不需要任何鑄件。引入Integer,Double等包裝類的原因之一是避免投射。

0

首先,你不應該使用一個通用的HashMap,因爲這樣編譯器不能幫你的類型。嘗試聲明以下內容:

HashMap<String, Integer> hashmap = new HashMap(); 

我不建議存儲不同值類型的HashMap,因爲它只是引發編程錯誤。此外,沒有必要將int投射到Double。你可以做任何以下的:

x = listabc.get(0) * 100.0/total; // multiply by a floating-point number 

x = (double) listabc.get(0) * 100/total; // cast with (double) 
2

代碼中的微小變化將授予成功:

x = (double) listabc.get(0)*100/total; 

整數和雙精度都投不兼容,但是int和double正在擴大兼容。在你當前的代碼中,表達式的右邊(RHS)被自動裝箱到一個Integer,然後你指定一個結果到Double。此投射失敗。

通過改爲指定加寬轉換,將Integer結果取消裝箱到int,然後轉換爲double。然後最後這一行:

return x; 

盒向上的x值插入到一個Double並返回它作爲該方法的結果。

相關問題