Java 使用JSON迭代器键入安全警告

Java 使用JSON迭代器键入安全警告,java,android,json,Java,Android,Json,我的问题来自于从JSONObject获取迭代器 最简单形式的代码生成错误: String json = client.retrieveList(); JSONObject jsonList = new JSONObject(json); Iterator<String> i = jsonList.keys(); while(i.hasNext()) { String next = i.next(); JSONArray jsonArray = jsonList.ge

我的问题来自于从JSONObject获取迭代器

最简单形式的代码生成错误:

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);
}
String json=client.retrieveList();
JSONObject jsonList=新的JSONObject(json);
迭代器i=jsonList.keys();
while(i.hasNext())
{
字符串next=i.next();
JSONArray JSONArray=jsonList.getJSONArray(下一步);
//使用jsonArray进行操作,例如:jsonArray.getString(0),jsonArray.getString(1);
}
确切的警告是: 类型安全:类型迭代器的表达式需要未经检查的转换才能符合迭代器

所以问题是我如何才能消除这个警告


非常感谢

当您将代码与旧的遗留API-s混合使用时,您可能会收到此类警告。如果确实要“消除”警告,可以使用SuppressWarnings注释。在被抑制的警告旁边留下评论是一种好的做法。在您的情况下,这可能看起来像:

@SuppressWarnings("unchecked") //Using legacy API
Iterator<String> i = jsonList.keys();
@SuppressWarnings(“unchecked”)//使用旧API
迭代器i=jsonList.keys();

干杯

我意识到这是一条老线索,但对于未来的搜索者来说

您还可以推断泛型并强制转换迭代器方法的返回

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

while(i.hasNext())
{
    String next = (String) i.next();
    ...
Iterator i=jsonList.keys();
while(i.hasNext())
{
String next=(String)i.next();
...

我希望有一个更好的方法来抑制它。我认为这可能是我所接受的。“SuppressWarnings(“未选中”)是一个非常危险的习惯。假设“JSONLIST”可能是空的。现在,你已经隐藏了警告。我认为如果我的团队中的任何开发者使用这个来隐藏警告,我认为这是一个严重的警告信号。“良好做法"不要把磁带放在发动机警告灯上,不管你在磁带上写了什么评论。修正:想想看,你至少指定了要抑制的警告类型,所以空案例不适用。这很公平。但这仍然是一个危险的习惯,另一个答案确实提供了一个更优雅的解决方案。抑制一般来说,g警告是个坏主意,但在这种情况下没有问题。根据文档,“名称是唯一的非空字符串。”我想如果你想格外小心,你可以自己使用泛型并检查它,但我怀疑在这种情况下信任文档是可以的。是的,这应该是经过验证的答案。消除警告而不必抑制它。这可能会抑制警告,但是(String)I.next()可能会引发运行时异常。