0

次のコードの場合:

ArrayList<String> ar = new ArrayList<String>();
ar.add(45);

ArrayList<String> ar = new ArrayList();
ar.add(45);

次の行でコンパイル時エラーが発生しますar.add(45)

cannot find symbol
symbol  : method add(int)
location: class java.util.ArrayList<java.lang.String>
                al.add(45);
                  ^

両方のコードが無効な入力で失敗しています。では、なぜコンパイラは、コードの 2 番目の部分に対して未チェックまたは安全でない操作の警告を発しているのでしょうか?

4

4 に答える 4

5

では、なぜコンパイラは、コードの 2 番目の部分に対して未チェックまたは安全でない操作の警告を発しているのでしょうか?

ArrayListtype の変数にan を割り当てているためですArrayList<String>。つまり、コンパイラは、配列リストを介してそのリストを参照するときに、配列リストに文字列のみが含まれるという期待を強制しますが、使用するパラメーター化されていないものへの他のar参照がないことを確認することはできません。次のように、文字列以外を追加します。ArrayList

ArrayList anythingGoes = new ArrayList();
ArrayList<String> onlyStrings = anythingGoes; // Unchecked/unsafe op
anythingGoes.add(new Date());
for (String s : onlyStrings) { // Blows up
    // ...
}
于 2013-08-07T10:47:41.467 に答える
2

2 番目のコードでは、ArrayList の型パラメーターを指定していないためです。Java 7 では次のように記述できます。

ArrayList<String> ar = new ArrayList<>();
于 2013-08-07T10:47:58.393 に答える
0

ここには2 つの明確な問題があります。

まず-

ArrayList<String> ar = new ArrayList();

ar文字列のリストであることをコンパイラに伝えていますが、それを生の型のリスト (つまり、無制限) に割り当てています。したがって、コンパイラは、チェックされていない、または安全でない操作について警告します。以下のいずれかのオプションのようなものを使用する必要があります。

ArrayList<String> ar = new ArrayList<String>();

また

ArrayList<String> ar = new ArrayList<>();

(2 番目のオプションは Java 7 の例であり、入力の量を減らすだけです。結果は同じです)。

第二に -

ar.add(45);

文字列のリストに整数 (45) を追加しています。コンパイラは、これを行うことを許可しません。

于 2013-08-07T10:51:16.183 に答える