簡體   English   中英

ClassCastException,將Integer轉換為Double

[英]ClassCastException, casting Integer to Double

ArrayList marks = new ArrayList();
Double sum = 0.0;
sum = ((Double)marks.get(i));

每次我嘗試運行我的程序時,都會遇到一個ClassCastException:java.lang.Integer無法強制轉換為java.lang.Double

我們可以將int轉換為double但我們不能對包裝類IntegerDouble執行相同的操作:

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

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

這顯示了與運行時異常相對應的編譯時錯誤。

嗯,你已經證明實際上不包括添加任何整數到代碼ArrayList -但如果知道你有整型,你可以使用:

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

這會將它轉換為int ,然后可以將其轉換為double 你不能直接在盒裝類之間投射。

請注意,如果您可以為ArrayList使用泛型,那么您的代碼將更加清晰。

問題中發布的代碼顯然不是一個完整的例子(它沒有向arraylist添加任何東西,它不是在任何地方定義i )。

首先,正如其他人所說,您需要了解原始類型與封裝它們的類類型之間的區別。 例如IntegerintDoubledoubleLonglong等上。 Java會在各種場景中自動進行裝箱和取消裝箱(過去你必須手動裝箱和取消裝箱庫調用,但這被認為是一個丑陋的PITA)。

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

您可以主要從一種基本類型轉換為另一種基本類型(例外是boolean )但您不能對盒裝類型執行相同操作。 將一個盒裝類型轉換為另一個類型有點復雜。 特別是如果你事先不知道盒子類型。 通常它將涉及通過一種或多種原始類型進行轉換。

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

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

cast to int將在幕后首先將marks.get的結果marks.getInteger ,然后將unbox整數。 然后我們使用另一個強制轉換將原始int轉換為原始double 最后,當將結果分配給sum變量時,結果將自動退回到Double (請注意,在大多數情況下,總和可能更有意義的是double類型而不是Double類型)。

如果您的arraylist包含多種類型的混合,但它們都實現了Number接口(Integer,Short,Long,Float和Double都可以,但不包括Character和Boolean),那么你可以這樣做。

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

如果混合中還有其他類型,那么您可能需要考慮使用instanceof運算符來識別它們並采取適當的操作。

這里要理解的兩件事 -

1)如果要將Primitive interger為Primitive 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();

指定你的標記:

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

這稱為泛型。

將整數更改為double

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

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

代碼將輸出整數“abc”作為double,這意味着它將顯示為“12.0”。 注意如何存在小數位,表示已存儲該精度數字。

如果要更改它,則與double相同,

double number=13.94;

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

此代碼將在一行上打印,“number”作為整數打印。 輸出將為“13”。 請注意,該值尚未向上舍入,實際上已省略了數據。

sum = Double.parseDouble(""+marks.get(i));
Integer x=10;
Double y = x.doubleValue();

這意味着您的ArrayList在某些元素中具有整數。 除非你的一個元素中有一個整數,否則轉換應該有效。

確保你的arraylist沒有整數的一種方法是將它聲明為雙打數組。

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

我認為主要的問題是你使用包裝類進行轉換,似乎它們是不兼容的類型。

但另一個問題是“i”是一個int,所以你要投出最終結果,你也應該投我。 另外嘗試使用關鍵字“double”來強制轉換而不是“Double”包裝類。

你可以在這里查看:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM