web-dev-qa-db-ja.com

ClassCastException、IntegerをDoubleにキャスト

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

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

39
Khuba

intdoubleにキャストできますが、ラッパークラスIntegerおよびDoubleで同じことはできません。

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

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

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

50
Andreas_D

さて、あなたが示したコードには、実際にArrayListに整数を追加することは含まれていませんが、do整数があることを知っているなら、次のように使用できます:

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

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

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

32
Jon Skeet

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

最初に、他の人が言ったように、プリミティブ型とそれらを囲むクラス型の違いを理解する必要があります。例えば。 IntegerボックスintDoubleボックスdoubleLongボックスlongなど。 Javaさまざまなシナリオで自動的にボックス化およびボックス化解除します(以前はライブラリ呼び出しで手動でボックス化およびボックス化解除する必要がありましたが、これはいPITAと見なされていました)。

http://docs.Oracle.com/javase/tutorial/Java/data/autoboxing.html

ほとんどの場合、あるプリミティブ型から別のプリミティブ型にキャストできます(例外はbooleanです)が、ボックス化されたタイプに対して同じことはできません。あるボックス化されたタイプを別のボックス化されたタイプに変換することは、もう少し複雑です。特に、ボックスの種類が事前にわからない場合。通常、1つ以上のプリミティブ型を介した変換が含まれます。

したがって、質問への答えは、実行できるInteger型のオブジェクトである場合、arraylistの内容によって異なります。

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

intへのキャストは、舞台裏で最初にmarks.getの結果をIntegerにキャストしてから、その整数のボックス化を解除します。次に、別のキャストを使用して、プリミティブintをプリミティブdoubleに変換します。最後に、結果は合計変数に割り当てられたときにDoubleに自動ボックス化されます。 (また、ほとんどの場合、sumがdoubleではなくDouble型である方が理にかなっています)。

Arraylistにタイプの混合が含まれているが、すべてがNumberインターフェイスを実装している場合(整数、ショート、ロング、フロート、およびダブルはすべて実行しますが、文字とブールは実行しません)、実行できます。

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

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

10
Peter Green

ここで理解すべき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();
7
sapy

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

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

これはジェネリックと呼ばれます。

5
Vladimir Ivanov

整数を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」という1行に出力されます。出力は「13」になります。値は切り上げられておらず、データは実際には省略されていることに注意してください。

3
BOb B.
sum = Double.parseDouble(""+marks.get(i));
2
total_chaos
Integer x=10;
Double y = x.doubleValue();
1
vimal chaudhary

これは、ArrayListの一部の要素に整数があることを意味します。キャストは、要素の1つに整数がない限り機能するはずです。

Arraylistに整数がないことを確認する1つの方法は、配列リストをDoubles配列として宣言することです。

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

主な問題は、ラッパークラスを使用してキャストしていることであり、互換性のないタイプであると思われます。

しかし、もう1つの問題は、「i」がintであるため、最終結果をキャストしているので、iもキャストする必要があることです。また、「Double」ラッパークラスではなく、キーワード「double」を使用してキャストしてみてください。

ここで確認できます:

お役に立てれば。スレッドは有用であることがわかりましたが、これによりスレッドがさらに明確になると思います。

0
palmaone