2013-08-20 3 views
9

Eclipseは型の安全性の警告を表示し、私はそれを根絶するために、ほとんどすべてのものを試してみました。
型の安全に関する警告がなくなるようにコードを変更する必要があることはご存じですか?または、@SuppressWarnings("unchecked")唯一の方法ですか?型の安全性に関する警告以下の最後の行の - 残念ながら、私は任意の成功ではなかった(もちろん、それはオプションになり抑制する)を念頭に置いてのタイプの安全性が

ArrayList<String> arrayList= (ArrayList<String>) Classname.getArrayList();  
JSONArray obj = new JSONArray(); 
obj.addAll(arrayList); 

が表示されます。

型の安全性を: 方法のaddAll(コレクション)生型ArrayListに属します。ジェネリック型ArrayListへの参照は、パラメータ化する必要があります。

JSONArrayはorg.json.simple.JSONArrayです。別のパッケージをお勧めしますか?

+0

ご迷惑をおかけしますが、問題はJSONArrayの実装にあるため、ジェネリックは使用していません。 – Felquir

+0

JSONArrayの別の実装を使用することをお勧めしますか?つまり、 'org.json.simple.JSONArray'以外のパッケージを使用するか、' @SuppressWarnings( 'unchecked') 'を追加する方がいいでしょうか? – Brenne

+0

私の答えをお読みください。 – Felquir

答えて

2

あなたはJSONで作業したい場合は、このライブラリを行く、このライブラリは素晴らしいサポートhttps://code.google.com/p/google-gson/を持っています。

これは例である:

Gson gson = new Gson(); 
Collection<Integer> ints = Lists.immutableList(1,2,3,4,5); 

(Serialization) 
String json = gson.toJson(ints); ==> json is [1,2,3,4,5] 

おかげ

0

JSONArrayのドキュメントからは、生タイプ(extends ArrayList)のように見えます(ジェネリックタイプパラメータはありません)。これは、非ジェネリックレガシーコードを扱うの一例であり、続行する唯一の方法は、JSONArrayは、いくつかのString Sを受信されることを期待していると、警告を抑制することが非常に確認することです。

(それを修正するための現実的な方法は、ジェネリックを使用するJSONArrayを更新することになるが、その間に、あなたは生のタイプを使用する必要があります。)

3

org.jsonとorg.json.simple JSONパーサーは下のコレクションの生タイプを使用。あなたが良いをお探しの場合GenericsサポートGoogle Gsonをお試しください。ここでは、GsonであなたのジェネリックArrayListを直列化については行くだろう方法は次のとおりです。

Gson gson = new Gson(); 

ArrayList<String> arrayList= (ArrayList<String>) ClassName.getArrayList(); 

// Serializing to a JSON element node 
JsonElement jsonElement = gson.toJsonTree(arrayList); 
System.out.println(jsonElement.isJsonArray()); // true 

// Or, directly to JSON string 
String json = gson.toJson(arrayList); 
System.out.println(json); 

ここでは、そのままそのジェネリックと同じJSON文字列をデシリアライズする方法をです:

Type type = new TypeToken<ArrayList<String>>(){}.getType(); 
ArrayList<String> arrayList = gson.fromJson(json, type); 
1

あなたの質問のための短い答えはあなたがそれを消すためにそれを抑えなければならないということです。問題はJSONArrayのタイプが用意されていない場合、型の安全性を保証する方法がないので、それは、あなたがのaddAllメソッドを使用して置くかについてではありません。 、EはのaddAllメソッドコレクションを追加することができます方法を作るどのオブジェクトにフォールバックタイプのパラメータを設けることなく、

public boolean addAll(java.util.Collection<? extends E> es) 

JSONArrayは非パラメータ化のArrayListを継承してのaddAllメソッドは、次のように定義されます既存のコレクションの上に何も含まれていません。そのため、あなたはこのような何かを行うことができます。

List<Dog> dogs = new ArrayList<Dog>(); 
dogs.add(new Chiwawa()); 

List<Car> cars = new ArrayList<Car>(); 
cars.add(new BMW()); 

JSONArray jsonArray = new JSONArray(); 
jsonArray.addAll(dogs); 
jsonArray.addAll(cars); 

犬と車が同じJSONArray(ArrayListの)に一緒に追加され、かろうじてオブジェクトとして扱われます。このようなことをした場合、オブジェクトのいずれかを取り戻すと、そのオブジェクトが犬か車かを判断できません。これが警告が存在する理由です。

ジェネリック型パラメータ(例えば犬)を使用することにより、のaddAll定義は次のようになります。これは、パラメータのみ犬と犬の子クラスのコレクションを受け入れることができることを確認し

public boolean addAll(java.util.Collection<? extends Dog> es) 

。したがって、コレクションから取得するときは、RetrieオブジェクトをDogに割り当てることが安全です。

何か問題があったために警告が表示されません。これは、JSONArrayがパラメータ化されていないCollectionを継承しているためです。それを抑えてください。

0

ArrayListJsonArrayに変換するためにGsonライブラリを使用してください。

Gson gson = new GsonBuilder().create(); 
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray(); 
関連する問題