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
に整数を追加することは含まれていませんが、do整数があることを知っているなら、次のように使用できます:
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
です)が、ボックス化されたタイプに対して同じことはできません。あるボックス化されたタイプを別のボックス化されたタイプに変換することは、もう少し複雑です。特に、ボックスの種類が事前にわからない場合。通常、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
演算子を使用してそれらを識別し、適切なアクションを実行することを検討する必要があります。
ここで理解すべき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();
マークを指定してください:
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」という1行に出力されます。出力は「13」になります。値は切り上げられておらず、データは実際には省略されていることに注意してください。
sum = Double.parseDouble(""+marks.get(i));
Integer x=10;
Double y = x.doubleValue();
これは、ArrayListの一部の要素に整数があることを意味します。キャストは、要素の1つに整数がない限り機能するはずです。
Arraylistに整数がないことを確認する1つの方法は、配列リストをDoubles配列として宣言することです。
ArrayList<Double> marks = new ArrayList<Double>();
主な問題は、ラッパークラスを使用してキャストしていることであり、互換性のないタイプであると思われます。
しかし、もう1つの問題は、「i」がintであるため、最終結果をキャストしているので、iもキャストする必要があることです。また、「Double」ラッパークラスではなく、キーワード「double」を使用してキャストしてみてください。
ここで確認できます:
お役に立てれば。スレッドは有用であることがわかりましたが、これによりスレッドがさらに明確になると思います。