2

My code is:

import java.util.*;

public class A {
public static void main(String[] args){
    List<String> list = new ArrayList();
    list.add("1"); //ok   line 1
    list.add(1); //error  line 2
}

When I run this code Java gives me an error and I know why, but even when I only use line 1 the compiler warns me. Why do I get this warning? I don't understand what is the difference between my first example and this code:

import java.util.*;

public class A {
    public static void main(String[] args){
        List<String> list = new ArrayList<String>(); // <-- notice the second <String>
        list.add("1"); //ok   line 1
        list.add(1); //error  line 2
    }
}
4

4 に答える 4

5

このコードを実行すると、Java でエラーが発生し、その理由はわかっていますが、1 行目しか使用していない場合でも、コンパイラから警告が表示されます。この警告が表示されるのはなぜですか?

コードを使用すると、コンパイラは次のような警告を表示します

List<String> list = new ArrayList();

ArrayList は生の型です。ジェネリック型 ArrayList への参照はパラメーター化する必要があります

ArrayList にもパラメーター化された型を提供する必要があると書かれています。

List<String> list = new ArrayList<String>();

編集:

@newacct が提案したように: Java 7 を使用している場合は、次のように Collection をインスタンス化するときに空の角かっこ (<>) を使用できます。

List<String> list = new ArrayList<>();

Java 7のドキュメントから:

コンパイラがコンテキストから型引数を推測できる限り、ジェネリック クラスのコンストラクターを呼び出すために必要な型引数を空の型パラメーターのセット (<>) に置き換えることができます。

于 2012-12-08T20:51:21.753 に答える
1

コード 2 は、sを使用してリストにint(または) を追加できないため、コンパイルされませんが、それは既にわかっています。IntegerString

コード 1 について言えば、使用しているコンパイラとそのコンパイラが使用している設定に応じて、コンパイラが警告するいくつかの理由が考えられます。以下にいくつかのオプションを示します。

  • パラメータ化されたオブジェクトの構築では、パラメータも指定する必要があります。このコード片:List<String> list = new ArrayList()では、オブジェクトの構築にArrayListパラメータがありませんが、これはリファレンスで指定されています。コンパイラは、List<String> list = new ArrayList<String>()代わりに使用することを提案します。
  • 冗長な型引数を使用しています。コードを使用するときList<SomeType> list = new ArrayList<SomeType>();に、パラメータの型を 2 回指定していますSomeType。コンパイラは、ダイヤモンド推論( new ArrayList<>()) を使用することを提案します。この提案は、Java バージョン 1.7 以降で使用されています。

上記の最初のオプションについてコンパイラが警告していると思います。ただし、私のコンパイラは、コードをテストするときに警告を出しません。

于 2012-12-08T20:56:39.280 に答える
1

これは、ジェネリックの概念を理解するのに役立つ場合があります:なぜジェネリックを使用するのか。

コードを次のように変更すると、エラーや警告は発生しなくなります。

import java.util.*;
public class A{

public static void main(String[] args){
    List<Object> list = new ArrayList<Object>();
    list.add("1"); //ok   code 1
    list.add(1); //error  code 2

}
}
于 2012-12-08T20:58:53.650 に答える
0

タイプ文字列のリストがあるため、整数を入れることはできません。

于 2012-12-08T20:50:33.687 に答える