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

プログラムを実行しようとするたびに、次のような ClassCastException が発生します: java.lang.Integer は java.lang.Double にキャストできません

4

10 に答える 10

55

intanを a にキャストできますが、ラッパー クラスとdoubleで同じことはできません。IntegerDouble

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

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

これは、ランタイム例外に対応するコンパイル時エラーを示しています。

于 2011-04-06T12:55:17.730 に答える
35

あなたが示したコードには、実際にはArrayList-に整数を追加することは含まれていませんが、整数があることわかっている場合は、次を使用できます。

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

それは に変換され、int次に に変換できdoubleます。ボックス化されたクラス間で直接キャストすることはできません。

にジェネリックを使用できる場合はArrayList、コードがより明確になることに注意してください。

于 2011-04-06T12:29:13.207 に答える
11

質問に投稿されたコードは明らかに完全な例ではありません (配列リストに何も追加していない、iどこにも定義していない)。

まず、他の人が言ったように、プリミティブ型とそれらをボックス化するクラス型の違いを理解する必要があります。たとえば、IntegerボックスintDoubleボックスdoubleLongボックス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.getInteger、次にその整数をアンボックスします。次に、別のキャストを使用して、プリミティブintをプリミティブに変換しdoubleます。最後に、結果がDoublesum 変数に割り当てられると、結果はオートボックス化されて a に戻されます。double(余談ですが、ほとんどの場合よりもsum が型である方がおそらく理にかなっているでしょうDouble)。

配列リストにタイプの混合が含まれているが、それらがすべてNumberインターフェイスを実装している場合 (Integer、Short、Long、Float、Double はすべて実装していますが、Character と Boolean は実装していません)、実行できます。

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

他のタイプも混在している場合は、instanceof演算子を使用してそれらを識別し、適切なアクションを実行することを検討する必要がある場合があります。

于 2015-01-06T18:41:42.237 に答える
5

マークを指定してください:

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

これをジェネリックと呼びます。

于 2011-04-06T12:29:41.080 に答える
1
Integer x=10;
Double y = x.doubleValue();
于 2019-02-20T10:08:48.273 に答える