[英]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
但我們不能對包裝類Integer
和Double
執行相同的操作:
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
)。
首先,正如其他人所說,您需要了解原始類型與封裝它們的類類型之間的區別。 例如Integer
盒int
, Double
箱double
, Long
盒long
等上。 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.get
為Integer
,然后將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.