可能性のある複製:
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
誰も私に理由を説明できますか?
必ずこのチュートリアルを読む必要がありますJava generics: http://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...
}
_
ここで、そのようなクラスのインスタンスを作成するとき、たとえばString
(E
は通常、任意の型に評価できます)など、typeパラメーターの具体的な値を定義します。
_ArrayList<String> stringList = new ArrayList<String>();
_
これ以降、すべてのE
sはString
変数のstringList
に「置換」されるため、ストリングのみを追加し、ストリングからのみ取得できます。コンパイラは、誤って別のタイプのオブジェクトを追加しないことを確認します。
_stringList.add(Integer.valueOf(1));
// compile error - cannot add Integer to ArrayList of Strings
_
ただし、ジェネリックがJava 5に追加されたため、下位互換性のためにそれらを使用せずにコードを記述することは可能です。
_ArrayList list = new ArrayList();
_
ただし、型チェックの利点はすべて失われます。メソッドシグネチャのE
sは、単にObject
sになります。
_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
のタイプを使用します。
ArrayListにはどのようなオブジェクトが保存されていますか?宣言に追加する必要があります。いつも
ArrayList<Type>
したがって、JSONObjectsのリストの場合、
ArrayList<JSONObject>
お役に立てば幸いです。
これは、Javaコンパイラが特定のチェックを試みるためです。それを書いた方法では、オブジェクトのArrayListをパラメータとして受け取ることをコンパイラに効果的に伝えます。 ArrayListに保存します。ArrayList<MyClass>
またはArrayList <?>
は警告を取り除きます。 2番目のバージョンは、コンパイル時に不明なクラスのオブジェクトのArrayListを渡すことをコンパイラに効果的に伝えます。
Javaのジェネリックについて少し読むと役に立つかもしれません。 http://docs.Oracle.com/javase/tutorial/Java/generics/
JsonArray
のコンストラクターは、パラメーターCollection
を持つジェネリック型T
を受け取ることを期待しますが、items
の型は、型が指定されていないArrayList
です。この質問を確認して、未加工の型についてのアイデアを得ることができます: 未加工の型とは何ですか、なぜ使用しないのですか?
解決策1(推奨):パラメーターitems
でT
を渡すか、String
などの具体的なタイプを指定します。この質問はあなたの特定の問題に役立つかもしれません: ArrayList <MyCustomClass>をJSONArray に変換します。
解決策2:メソッドfromArraytoString
の前に@SuppressWarnings("unchecked")
を追加します。これは推奨されませんが、次の質問を参照できます: JavaでのSuppressWarnings( "未チェック")とは?