2011-04-06 72 views
31
ArrayList marks = new ArrayList(); 
Double sum = 0.0; 
sum = ((Double)marks.get(i)); 

每次我嘗試運行我的程序,我得到,指出一個ClassCastException:java.lang.Integer中不能轉換爲java.lang.Double的ClassCastException異常,鑄造整數到雙

回答

25

那麼你的代碼」已經出實際上不包括添加任何整數到ArrayList - 但是如果你知道你有整型,你可以使用:

sum = (double) ((Integer) marks.get(i)).intValue(); 

這將其轉換爲int,然後可以被轉換爲double。你不能直接在盒裝類之間進行投射。

請注意,如果您可能使用泛型爲您的ArrayList,您的代碼將更清晰。

+1

如果你使用'Integer.doubleValue()',沒有必要投'int'到'double'。 'sum =((Integer)marks.get(i))。doubleValue();'會更簡潔。 – 2016-03-12 04:41:32

5

指定標記:

List<Double> marks = new ArrayList<Double>(); 

這就是所謂的仿製藥。

+0

如果ArrayList滿了雙打,那麼他不會得到ClassCastException。該數組必須充滿整數,對嗎? – Gray 2011-04-06 12:32:01

+2

@Gray - 一個'Integer'就夠了;) – 2011-04-06 12:55:52

42

我們可以投一個intdouble,但我們不能做同樣的包裝類IntegerDouble

int  a = 1; 
Integer b = 1; // inboxing, requires Java 1.5+ 

double c = (double) a; // OK 
Double d = (Double) b; // No way. 

這表明對應於您的運行時異常的編譯時錯誤。

+1

嗯,這是一個老問題。 Java 7允許我將Integer轉換爲* double *,並且魔法發生在我期望的方式:'Double km =(double)(meters * 1_000);' – will 2017-09-22 00:36:37

0

這意味着你的ArrayList在一些元素中有整數。除非你的元素中有一個整數,否則投射應該工作。

確保您的數組列表中沒有整數的一種方法是將其聲明爲雙精度數組。

ArrayList<Double> marks = new ArrayList<Double>(); 
3

改變的整數,以雙

int abc=12; //setting up integer "abc" 

System.out.println((double)abc); 

代碼將輸出整數「ABC」作爲雙,這意味着它會顯示爲「12.0」。注意如何有一個小數位,表示這個精度數字已被存儲。

同雙,如果你想改回去,

double number=13.94; 

System.out.println((int)number); 

這段代碼將打印在同一行,「數量」爲整數。輸出將是「13」。請注意,該值未被四捨五入,數據實際上已被省略。

8

在問題中發佈的代碼顯然不是一個完整的例子(它不會添加任何內容給arraylist,它不會在任何地方定義i)。

首先像其他人所說的,您需要了解原始類型和包裝它們的類類型之間的區別。例如。 Integer箱子int,Double箱子double,Long箱子long等等。 Java會在各種場景中自動打開盒子和取出盒子(過去,你必須用庫調用手動打開盒子和取消盒子,但這被認爲是一種醜陋的PITA)。

http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

可以主要來自一個基本類型強制轉換爲另一種(唯一的例外是boolean),但你不能盒裝類型做同樣的。將一個盒裝類型轉換爲另一個更復雜一點。特別是如果你事先不知道盒子的類型。通常它將涉及通過一個或多個基本類型進行轉換。

所以你的問題的答案取決於你的數組列表中的內容,如果它只是Integer類型的對象,你可以做。

sum = ((double)(int)marks.get(i)); 

演員到int將幕後第一投的marks.get的結果Integer,那麼它會拆箱該整數。然後我們使用另一個強制轉換將原始的int轉換爲原始的double。最後,當結果分配給sum變量時,結果將被自動複製回Double。 (在大多數情況下,對於總和爲double而不是Double),可能更有意義。

如果你的數組列表包含混合類型,但它們都實現了接口(整數,短,長,浮點和雙精度除了字符和布爾值都不能),那麼你可以這樣做。

sum = ((Number)marks.get(i)).doubleValue(); 

如果在混合有其他類型的過,那麼你可能需要考慮使用instanceof運營商識別它們並採取適當的行動。

1
sum = Double.parseDouble(""+marks.get(i)); 
+1

請考慮添加一個關於您的代碼片段爲什麼以及如何回答OP題。 – 2015-06-23 17:20:17

+3

如果marks.get(i)爲null,它會發生 – 2015-09-15 13:46:24

0

我認爲主要的問題是你使用包裝類來鑄造,似乎他們是不兼容的類型。

但另一個問題是,「我」是一個int,所以你正在施放最後的結果,你也應該施放我。也請嘗試使用關鍵字「double」進行強制轉換,而不是「Double」包裝類。

您可以點擊這裏:

希望這有助於。我發現該線程很有用,但我認爲這有助於進一步澄清它。

3

2件事情需要明白 -

1)如果您是鑄造原始interger到原始double。有用。例如它工作正常。

int pri=12; System.out.println((double)pri);

2)如果您嘗試投Integer對象Double對象或副 - 反之亦然,這將失敗。

Integer a = 1; Double b = (double) a; // WRONG. Fails with class cast excptn 

解決方案 -

Soln 1) Integer i = 1; Double b = new Double(i); 
soln 2) Double d = 2.0; Integer x = d.intValue();