【问题标题】:Should I be able to use a Java for-each with type Object? [closed]我应该能够使用类型为 Object 的 Java for-each 吗? [关闭]
【发布时间】:2013-02-25 16:13:31
【问题描述】:

我有一个JSONArray 的实例,我只是想知道是否可以使用 for-each 构造按顺序处理每个元素。所以我尝试了:

for( Object jsonObj: jsonArray ) {
  System.out.println("JSONArray element: '" + ((JSONObject)jsonObj).toString() + "'");
}

令我惊讶的是,它奏效了。我认为我需要使用实现 Iterable 的类。

因此,如果您能回答我最初的问题(在 JSONArray 上使用 for-each),那就太好了。另外:

  • 第二个问题:它为什么有效?
  • 第三个问题:我是否应该对在运输代码中实际使用它持谨慎态度?

谢谢大家!

【问题讨论】:

  • JsonArray 可迭代的。您将迭代器返回的每个项目隐式转换为 Object 的事实确实没有任何意义。而为什么你会这样做,这就是我要问的问题......
  • @BrianRoach 文档中的什么地方?
  • @Christian - 什么文档? 它编译,因此它正在实现Iterable
  • 对不起 - 这是我原始评论中的错字。我的意思是从jsonArray(他的变量名)开始 - 我不知道实际上是哪个类的实例,但如果他的代码编译并运行,那么它正在实现Iterable

标签: java object foreach loops arrays


【解决方案1】:

您可能知道,for each 循环 only works for Iterables and arrays

JSONArray doesn't implement iterable 的原始 json.org 实现,但是 @Quirim 和 @BrianRoach 指出的 Gson implementation does

在 json.org 版本中有一个 intend to implement it,但最后他们没有。

所以回答你的 3 个问题:

  1. 您必须使用 Gson 或类似的实现 实现可迭代的 JsonArray。
  2. 因为 JsonArray 是可迭代的。
  3. 不,你不应该。

【讨论】:

  • JsonArray 这个实现表明它是可迭代的。我不知道,这个实现现在是相关的,或者它是另一个正在使用的。
  • 那是 Gson 的 JsonArray 对吧?我采用了 json.org 实现。
  • 我真的不知道他在用什么。古老的粗犷 org.json.JSONArray 在我所知道的任何版本中都不可迭代,但无论如何我都不会使用它。你引用的 PR 关闭了它,但没有合并说他不想要它,所以它仍然与 1.4 兼容。无论他使用什么,都必须实现Iterable,否则它根本无法编译。
  • 是的,你是对的,官方的json.org上没有任何关于Iterable接口的信息。
  • Which ... 在该页面上告诉您它是可迭代的。您正在使用一些不使用泛型并且正在扩展 ArrayList 的古老库,这就是您必须从 Object 显式转换的原因
【解决方案2】:

The for-each loop 语法是在 java 1.5 中引入的。它的目的是清除你的代码中明显的东西,比如迭代器,它也切断了一些错误的可能性。

这种循环语句只适用于Iterable类,回答你的问题,因为JsonArray是实现Iterable接口。

关于你的代码,我认为它也可以工作,如果你确切地说jsonObjJSONObject 的类型,它不仅仅是Object。通过这种方式,您可以消除循环体中容易出错的类型转换。

【讨论】:

  • 但是我不能,先生。 JSONArrays 不包含 JSONObjects,它们包含 Objects。为了确定,我又试了一次。将 Object 更改为 JSONObject 会导致:类型不匹配:无法从元素类型 Object 转换为 JSONObject 而且我在 JSONArray 类中没有看到任何实现 Iterable 的内容:link
  • @user2100752 - 我们没有 ESP,我们不知道您使用的是什么库。不管它是什么,它不是您在上面链接的内容,否则您的代码不会编译别介意运行。
  • @Brian:你应该重新考虑 ESP,它确实会让事情变得更有效率。 ;) 另外,在我继承的这个项目中,我认为它是标准的 JSON 库,我的错。问题已回答。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多