0

Java で Generics を使用した次の ArrayList があるかどうか疑問に思っていました。

   int s=0;
    ArrayList<Integer> items=new ArrayList();
    for (int i=0;i<10;i++){
        items.add(i);
    }
    for (int j=0;j<items.size();j++){
        s=s+items.get(j);
    }

または、この生のフォームを使用する方が良いですか?

    List listitem=new ArrayList();
    for (int i=0;i<10;i++){
        listitem.add(i);
    }
    for (int j=0;j<listitem.size();j++){
        s=s+(int)listitem.get(j);
    }
    System.out.println(s);

ジェネリックを使用すると、変数のボックス化解除とボックス化の問題が発生することを読んだことを意味します。つまり、1つのプリミティブ型からオブジェクトに変更されます。では、どちらがおすすめでしょうか?また、どのような場合にジェネリックが最適な選択になるのでしょうか?

ありがとう

4

5 に答える 5

9

最新の Java では、raw フォームを使用することはほとんどありません。避けるのが難しい場所がいくつかありますが、一般的には悪い考えです。

2 番目のスニペットでrawListArrayListtypes を使用しても、ボクシングが妨げられることはありません。型の安全性が低下するだけです。汎用バージョンでは、リストに参照または null 値のみを含める必要があることをintコンパイラが認識しているため、のキャストは必要ありません。Integer生の形式では、コンパイル時の保証はありません。まったく異なる種類の参照 (文字列など) をリストに追加するのを止めるものは何もありません。

于 2013-09-07T15:57:43.923 に答える
3

ジェネリックを使用すると、変数のボックス化解除とボックス化の問題が発生し、1つのプリミティブ型からオブジェクトに変更されることを読みました。

間違い。どちらの例でも、オートボクシングとオートインボックスを行います。ジェネリックとは何の関係もありませんが、オブジェクトが必要な状況でプリミティブを使用することとは関係ありません。

予期しないタイプのオブジェクトをリストに追加していないことを確認するため、ジェネリック バージョンの方が優れています。

于 2013-09-07T15:58:37.730 に答える
2

私の意見では、ジェネリックは、コードが期待どおりに機能することをより確実にできるため、常に優れています。例えば:

List rawList = new ArrayList();
rawList.add(new Integer(2));
rawList.add("Howdy");
for(int i = 0; i < rawList.size(); i++)
{
    String listItem = (String) rawList.get(i); //java.lang.ClassCastException on 0
}

上記のコードはコンパイルされますが、キャストが正しくないために実行時に例外が発生しますが、次のコードはコンパイルされず、この種の間違いを防ぐことができます。

List<String> gernericList = new ArrayList<>();
gernericList.add(new Integer(2)); //Compiler error: no suitable method found for add(Integer)
gernericList.add("Howdy");
于 2013-09-07T15:58:03.097 に答える
0

ジェネリックを使用しないと、同じコレクションに異なるオブジェクトを格納できるため、キャストが原因で発生する予期しないランタイム例外を回避できるように、ジェネリックを使用することを好みます。

于 2013-09-07T15:58:54.503 に答える
0

どちらの場合も、例でボックス化とボックス化解除が行われています。常にデータ構造オブジェクトを使用するため、プリミティブ型への変換が発生します。プリミティブ型はオブジェクトの属性として処理されるため、反復ごとにプログラムがオブジェクトを作成する必要がないように、MutableInteger などのクラスを調べることができます。

于 2013-09-07T16:01:23.470 に答える