web-dev-qa-db-ja.com

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

可能性のある複製:
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

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

21
Diego

必ずこのチュートリアルを読む必要がありますJava genericshttp://docs.Oracle.com/javase/tutorial/Java/generics /

一言で言えば:

多くのJavaクラスとタイプ( generic classes または generic types と呼ばれる)、通常はコレクションには、 _ArrayList<E>_のEなどの type parameters と呼ばれる(Eは任意の選択された名前であり、他のクラスはTまたは何でも):

_public class ArrayList<E> extends ... {

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

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

    // other methods...
}
_

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

_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();
_

ただし、型チェックの利点はすべて失われます。メソッドシグネチャのEsは、単に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
_

rawタイプ(タイプパラメーターを省略したジェネリックタイプ)を使用することは安全ではないという事実が、警告の理由です。単にArrayListの代わりに、_ArrayList<String>_または_ArrayList<Integer>_、またはitemsのタイプを使用します。

47
Natix

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

ArrayList<Type>

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

ArrayList<JSONObject>

お役に立てば幸いです。

4
Marc Chambers

これは、Javaコンパイラが特定のチェックを試みるためです。それを書いた方法では、オブジェクトのArrayListをパラメータとして受け取ることをコンパイラに効果的に伝えます。 ArrayListに保存します。ArrayList<MyClass>またはArrayList <?>は警告を取り除きます。 2番目のバージョンは、コンパイル時に不明なクラスのオブジェクトのArrayListを渡すことをコンパイラに効果的に伝えます。

Javaのジェネリックについて少し読むと役に立つかもしれません。 http://docs.Oracle.com/javase/tutorial/Java/generics/

1
Swav

JsonArrayのコンストラクターは、パラメーターCollectionを持つジェネリック型Tを受け取ることを期待しますが、itemsの型は、型が指定されていないArrayListです。この質問を確認して、未加工の型についてのアイデアを得ることができます: 未加工の型とは何ですか、なぜ使用しないのですか?

解決策1(推奨):パラメーターitemsTを渡すか、Stringなどの具体的なタイプを指定します。この質問はあなたの特定の問題に役立つかもしれません: ArrayList <MyCustomClass>をJSONArray に変換します。

解決策2:メソッドfromArraytoStringの前に@SuppressWarnings("unchecked")を追加します。これは推奨されませんが、次の質問を参照できます: JavaでのSuppressWarnings( "未チェック")とは?

1
Hui Zheng