ArrayList marks = new ArrayList();
Double sum = 0.0;
sum = ((Double)marks.get(i));
プログラムを実行しようとするたびに、次のような ClassCastException が発生します: java.lang.Integer は java.lang.Double にキャストできません
ArrayList marks = new ArrayList();
Double sum = 0.0;
sum = ((Double)marks.get(i));
プログラムを実行しようとするたびに、次のような ClassCastException が発生します: java.lang.Integer は java.lang.Double にキャストできません
int
anを a にキャストできますが、ラッパー クラスと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
、コードがより明確になることに注意してください。
質問に投稿されたコードは明らかに完全な例ではありません (配列リストに何も追加していない、i
どこにも定義していない)。
まず、他の人が言ったように、プリミティブ型とそれらをボックス化するクラス型の違いを理解する必要があります。たとえば、Integer
ボックスint
、Double
ボックスdouble
、Long
ボックスlong
などです。Java は、さまざまなシナリオで自動的にボックス化およびボックス化解除します (以前は、ライブラリ呼び出しで手動でボックス化およびボックス化解除する必要がありましたが、これは醜い PITA と見なされていました)。
http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
ほとんどの場合、あるプリミティブ型から別の型にキャストできますが (例外はboolean
)、ボックス化された型に対して同じことはできません。ボックス化された型を別の型に変換するのは、もう少し複雑です。特に箱の種類が事前にわからない場合。通常、1 つ以上のプリミティブ型による変換が必要になります。
したがって、あなたの質問への答えは、配列リストの内容によって異なります。それが整数型のオブジェクトにすぎない場合です。
sum = ((double)(int)marks.get(i));
to へのキャストint
は、舞台裏で最初に to の結果をキャストmarks.get
しInteger
、次にその整数をアンボックスします。次に、別のキャストを使用して、プリミティブint
をプリミティブに変換しdouble
ます。最後に、結果がDouble
sum 変数に割り当てられると、結果はオートボックス化されて a に戻されます。double
(余談ですが、ほとんどの場合よりもsum が型である方がおそらく理にかなっているでしょうDouble
)。
配列リストにタイプの混合が含まれているが、それらがすべてNumber
インターフェイスを実装している場合 (Integer、Short、Long、Float、Double はすべて実装していますが、Character と Boolean は実装していません)、実行できます。
sum = ((Number)marks.get(i)).doubleValue();
他のタイプも混在している場合は、instanceof
演算子を使用してそれらを識別し、適切なアクションを実行することを検討する必要がある場合があります。
マークを指定してください:
List<Double> marks = new ArrayList<Double>();
これをジェネリックと呼びます。
Integer x=10;
Double y = x.doubleValue();