2010-11-28 21 views
30

私の問題はJSONObjectからイテレータを取得することにあります。JSONイテレータでの安全警告のタイプ

最も単純な形式でエラーを生成するコード:

String json = client.retrieveList(); 
JSONObject jsonList = new JSONObject(json); 
Iterator<String> i = jsonList.keys(); 

while(i.hasNext()) 
{ 
    String next = i.next(); 
    JSONArray jsonArray = jsonList.getJSONArray(next); 
    // Do stuff with jsonArray, example: jsonArray.getString(0), jsonArray.getString(1); 
} 

正確な警告がある: は、型の安全性:型イテレータの発現が

をイテレータに準拠するように未チェックの変換を必要とするので、問題はどのようにすることができますです私はこの警告を根絶しますか?

多くの感謝!

答えて

92

私は...私がいることを期待していた

Iterator<?> i = jsonList.keys(); 

while(i.hasNext()) 
{ 
    String next = (String) i.next(); 
    ... 
+4

+1これは良い/最良の答えと思われます。 – Ben

+0

はい、これは確認された回答である必要があります。警告を抑止する必要はありません。 – videogameboy76

+1

これは警告を抑制する可能性がありますが、(String)i.next()は実行時例外をスローする可能性があります。 – ForeverStudent

4

古いレガシーAPIとコードを混在させると、この種の警告を得ることができます。 が本当にの場合は、SuppressWarningsアノテーションを使用して警告を「根絶」します。抑止された警告の隣にはコメントを残すことをお勧めします。あなたの場合、これは次のようになります:

@SuppressWarnings("unchecked") //Using legacy API 
Iterator<String> i = jsonList.keys(); 

乾杯!

+1

あなたはまた、ジェネリックを推測し、反復子メソッドの戻りをキャストすることができます...これは古いスレッドですが、将来サーチャーのための実現それを抑制するよりも良い方法があるかもしれません。それは私が取るコースかもしれないと思う。 – Knossos

+3

@SuppressWarnings( "未チェック")は非常に危険な習慣です。 "jsonList"がnullである可能性があるとします。これで警告が表示されなくなりました。私が警告を隠すために私のチームの開発者がこれを使用するならば、私はそれを深刻な警告サインとみなします。上記のテープに書き込むコメントにかかわらず、テープをエンジンの警告灯の上に置かないことは、「良い習慣」です。 改正案:考えてみましょう。抑制する警告の種類を少なくとも指定しているので、nullの場合は適用されません。けっこうだ。しかし、それは依然として危険な習慣であり、他の答えはより洗練されたソリューションを提供します。 – DreadPirateShawn

+0

警告を抑制することは一般的には悪い考えですが、この場合は問題ありません。ドキュメントによると、 "名前は一意で、nullでない文字列です。"私はあなたが余分に慎重になりたい場合は、ジェネリックを取って自分で調べることができますが、この場合はドキュメントの信頼は大丈夫だと思われます。 –

関連する問題