3

実行時にこのコードをコンパイルする際に問題が発生しているため、java.lang.IntegerをJava.lang.Doubleにキャストできないというエラーが発生します。誰かがこのコードを修正するのを手伝ってくれたら嬉しいです

 double x;

 public Double getMethod() {

     HashMap hashmap= new HashMap();

     hashmap = SumCal();

     List  listabc = (List) hashmap.get("abclist");
     int total=(Integer) hashmap.get("all_total");
     x = (Double) listabc.get(0)*100/total;
     return x;
    }
4

3 に答える 3

5

以下のように行うことができますが、ジェネリックスを使用することをお勧めします。

x = ((Integer) listabc.get(0) * 100 / total);

以下のようなジェネリックを使用したことがある場合は、キャストは必要ありません。

List<Integer> listabc 
HashMap<String, Integer> hashmap 
x = listabc.get(0) * 100 / total;

その場合、キャストは必要ありません。Integer、Doubleなどのラッパークラスが導入された理由の1つは、キャストを回避するためです。

于 2013-02-23T02:37:40.557 に答える
3

コードを少し変更すると、成功が得られます。

x = (double) listabc.get(0)*100/total;

IntegerとDoubleはキャスト互換ではありませんが、intとdoubleは拡張互換です。現在のコードでは、式の右辺(RHS)が整数まで自動ボックス化されており、その結果のキャストをに指定しますDouble。このキャストは失敗します。

代わりに拡大変換を指定することにより、Integer結果はボックス化されていない状態になりint、次にに変換されdoubleます。そして最後にこの行:

return x;

xの値をaにボックス化しDouble、メソッドの結果として返します。

于 2013-02-23T02:38:43.357 に答える
0

まず、ジェネリックHashMapを使用しないでください。そうすると、コンパイラは型をサポートできなくなります。次のように宣言してみてください。

HashMap<String, Integer> hashmap = new HashMap();

プログラミングエラーを招くだけなので、値の異なるタイプのHashMapを保存することはお勧めしません。また、をにキャストする必要はありませintDouble。次のいずれかを実行できます。

x = listabc.get(0) * 100.0 / total; // multiply by a floating-point number

x = (double) listabc.get(0) * 100 / total; // cast with (double)
于 2013-02-23T02:34:53.860 に答える