29

重複の可能性:
ArrayList は生の型です。ジェネリック型 ArrayList<E> への参照はパラメーター化する必要があります

1 人のメンバーによって行われた支払いで ArrayList を保存するために、支払い ID のリストを文字列に変更したいので、次のメソッドを作成しました。

public String fromArraytoString(ArrayList items){
       JSONObject json = new JSONObject();
        json.put("uniqueArrays", new JSONArray(items));
        return json.toString();
           }

しかし、次の警告が表示されます。

   ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized

誰かが私に理由を説明できますか?

4

4 に答える 4

64

Javaジェネリックに関するこのチュートリアルを必ずお読みください:http : //docs.oracle.com/javase/tutorial/java/generics/

一言で言えば:

多くのJavaクラスおよび型(ジェネリッククラスまたはジェネリック型と呼ばれる)、通常はコレクションには、 in (任意に選択された名前、他のクラスの名前など)などのいわゆる型パラメーターがあります。EArrayList<E>ET

public class ArrayList<E> extends ... {

    public E get(int index) { ... }

    public boolean add(E element) { ... }

    // other methods...
}

ここで、そのようなクラスのインスタンスを作成するときは、たとえば、型パラメーターの具体的な値を定義しますStringE通常、必要な型に評価できます)。

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

これ以降、すべてのEsが変数に「置き換え」られるStringため、stringList変数に文字列のみを追加して、そこから文字列のみを取得できます。コンパイラは、別のタイプのオブジェクトを誤って追加していないことを確認します。

stringList.add(Integer.valueOf(1));
// compile error - cannot add Integer to ArrayList of Strings

ただし、ジェネリックがJava 5に追加されたため、下位互換性のためにジェネリックなしでコードを記述できます。だからあなたは書くことができます:

ArrayList list = new ArrayList();

ただし、タイプチェックの利点はすべて失われます。Eメソッドシグネチャのsは単純にObjectsになります。

list.add(Integer.valueOf(42)); // adding an Integer
list.add("aaa"); // adding a String

Object something = list.get(0); // unknown type of returned object, need to cast
Integer i0 = (Integer) something; // this unsafe cast works...
Integer i1 = (Integer) list.get(1); // but this fails with a ClassCastException
// because you cannot cast a String to Integer

生の型(つまり、型パラメーターが省略されたジェネリック型)を使用することは安全ではないという事実が、警告の理由です。ただの代わりに、またはまたはあなたのタイプが何であれArrayListを使用してください。ArrayList<String>ArrayList<Integer>items

于 2013-01-08T01:49:21.220 に答える
4

ArrayList にはどのようなオブジェクトが格納されますか? 宣言に追加する必要があります。いつも

ArrayList<Type>

したがって、JSONObjects のリストの場合は、

ArrayList<JSONObject>

それが役立つことを願っています。

于 2013-01-08T01:44:32.403 に答える
1

これは、Javaコンパイラが特定のチェックを実行しようとするためです。あなたがそれを書いた方法は、あなたがパラメータとしてオブジェクトのArrayListを受け取ることをコンパイラに効果的に伝えます。ArrayListに格納するオブジェクトのクラスを指定することをお勧めします。警告を指定ArrayList<MyClass>するか、または削除します。ArrayList <?>2番目のバージョンは、コンパイル時に不明なクラスのオブジェクトのArrayListを渡すことをコンパイラーに効果的に通知します。

Javaのジェネリックについて少し読んでおくと便利かもしれません。 http://docs.oracle.com/javase/tutorial/java/generics/

于 2013-01-08T01:46:04.523 に答える
1

JsonArrayCollectionのコンストラクターは、パラメーターを持つジェネリック型を受け取ることを期待していますTが、itemsの型にはArrayList型が指定されていません(つまり、raw型)。この質問をチェックして、rawタイプについてのアイデアを得ることができます。rawタイプとは何ですか。なぜそれを使用しないのですか?

解決策1(推奨):パラメーターを指定itemsして渡すTか、などの具象型を指定しますString。この質問は、特定の問題に役立つ可能性があります。ArrayList<MyCustomClass>をJSONArrayに変換します。

@SuppressWarnings("unchecked")解決策2:メソッドの前に追加しfromArraytoStringます。これはお勧めしませんが、次の質問を参照できます:JavaのSuppressWarnings(「チェックなし」)とは何ですか?

于 2013-01-08T01:46:47.613 に答える