【问题标题】:Type Safety warning with JSON Iterator使用 JSON 迭代器输入安全警告
【发布时间】:2011-05-16 20:08:57
【问题描述】:

我的问题来自于从 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);
}

确切的警告是: 类型安全:Iterator 类型的表达式需要未经检查的转换才能符合 Iterator

所以问题是我怎样才能消除这个警告?

非常感谢!

【问题讨论】:

    标签: java android json


    【解决方案1】:

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

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

    干杯!

    【讨论】:

    • 我希望有比压制它更好的方法。我认为这可能是我的课程。
    • @SuppressWarnings("unchecked") 是一个非常危险的习惯。假设“jsonList”可以为空——好吧,现在你已经隐藏了警告。如果我团队中的任何开发人员使用它来隐藏警告,我认为这是一个严重的警告信号。永远不要将胶带放在发动机警告灯上是“好习惯”,无论您在胶带上写什么评论。修正:想一想,您至少指定要禁止的警告类型,因此 null 情况不适用。很公平。但这仍然是一个危险的习惯,另一个答案确实提供了一个更优雅的解决方案。
    • 抑制警告通常是个坏主意,但在这种情况下没问题。根据文档,“名称是唯一的非空字符串。”我想如果你想格外小心,你可以使用通用并自己检查,但我怀疑在这种情况下信任文档是可以的。
    【解决方案2】:

    我意识到这是一个旧线程,但对于未来的搜索者......

    您还可以推断出泛型并转换迭代器方法的返回值...

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

    【讨论】:

    • 是的,这应该是经过验证的答案。无需取消警告即可消除警告。
    • 这可能会抑制警告,但是 (String) i.next() 可能会引发运行时异常。
    猜你喜欢
    • 2012-02-05
    • 2014-08-28
    • 2023-03-14
    • 1970-01-01
    • 2012-09-20
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多