2010-11-28 3 views
30

내 문제는 JSONObject에서 Iterator를 가져 오는 것으로 발생합니다.유형 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); 
} 

정확한 경고는 다음과 같습니다 는 유형 안전 : Iterator 형의 발현이

을 반복자에 맞도록 선택하지 않은 변환이 필요합니다 그래서 질문은 어떻게 할 수있다 이 경고를 근절합니까?

감사합니다.

답변

92

난 ... 난 것으로 기대했다

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

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

+1이 더 좋거나 가장 좋은 답변으로 보입니다. – Ben

+0

예. 확인 된 대답이어야합니다. 경고를 표시하지 않고이를 제거합니다. – videogameboy76

+1

경고를 줄이지 만, (String) i.next()는 잠재적으로 런타임 예외를 throw 할 수 있습니다. – ForeverStudent

4

이전 레거시 API와 코드를 혼합하면 이러한 종류의 경고를 얻을 수 있습니다. 이 실제로 인 경우 SuppressWarnings 주석을 사용할 수 있다는 경고를 "제거"하고 싶습니다. 억제 된 경고 옆에 주석을 남기는 것이 좋습니다. 이 경우 다음과 같이 표시 될 수 있습니다.

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

건배!

+1

당신은 또한 일반적인 추론과 반복자 방법의 반환을 캐스팅 할 수 있습니다 ...이 오래된 스레드이지만, 미래 수색자에 대한 실현 그것을 억제하는 것보다 더 좋은 방법이있을 수 있습니다. 나는 그것이 내가 잡는 과정일지도 모른다라고 생각한다. – Knossos

+3

@SuppressWarnings ("선택 취소")은 매우 위험한 습관입니다. "jsonList"가 null 일 수 있다고 가정 해 봅시다. 이제 경고를 숨 겼습니다. 우리 팀의 모든 개발자가 경고를 숨기기 위해 이것을 사용한다면 심각한 경고 신호라고 생각합니다. 테이프에 기록 할 수있는 의견에 관계없이 엔진 경고등 위에 테이프를 두지 않는 것이 "우수 실행"입니다. 수정안 : 생각해 보니 적어도 억제 할 경고 유형을 지정 했으므로 null 사례는 적용되지 않습니다. 공정하다. 그러나 여전히 위험한 습관이고 다른 대답은보다 우아한 해결책을 제공합니다. – DreadPirateShawn

+0

경고를 억제하는 것은 일반적으로 좋지 않지만이 경우에는 좋습니다. 설명서에 따르면 "이름은 고유하고 null이 아닌 문자열입니다." 나는 당신이 여분의주의를 원한다면, 당신은 제네릭을 가지고 그것을 직접 검사 할 수 있지만이 경우에는 문서를 신뢰하는 것이 괜찮다고 생각합니다. –