我应该为每个类型的对象使用Java吗?

我应该为每个类型的对象使用Java吗?,java,object,foreach,loops,arrays,Java,Object,Foreach,Loops,Arrays,我有一个JSONArray的实例,我只是想知道是否可以使用for-each构造按顺序处理每个元素。所以我试着: for( Object jsonObj: jsonArray ) { System.out.println("JSONArray element: '" + ((JSONObject)jsonObj).toString() + "'"); } 令我惊讶的是,它奏效了。我想我需要使用实现Iterable的类 因此,如果您能回答我的初始问题(在JSONArray上使用for each

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

for( Object jsonObj: jsonArray ) {
  System.out.println("JSONArray element: '" + ((JSONObject)jsonObj).toString() + "'");
}
令我惊讶的是,它奏效了。我想我需要使用实现Iterable的类

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

  • 第二个问题:它为什么起作用
  • 第三个问题:我是否应该对在运输代码中实际使用这一点保持警惕
谢谢大家

语法是在Java1.5中引入的。它的目的是从迭代器之类明显的东西中清除代码,同时它还切断了一些错误的可能性

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


关于您的代码,我认为它也可以工作,如果您确切地说,
jsonObj
JSONObject
的类型,它不仅仅是一个
对象。通过这种方式,您可以从循环体中省去容易出错的类型转换。

正如您可能知道的,每个循环的类型转换

正如@Quirim和@BrianRoach所指出的,JSONArray的原始json.org实现,但是

在json.org版本中有一个错误,但最终没有

因此,要回答您的3个问题:

  • 您必须使用Gson或类似的 实现iterable的JsonArray
  • 因为JsonArray是可移植的
  • 不,你不应该

  • JsonArray非常适合。您隐式地将迭代器返回的每个项强制转换为
    对象
    这一事实实际上与此无关。你为什么要这样做,这是我要问的问题…@BrianRoach,它在文件里说的是什么?@Christian-什么文件?它进行编译,因此实现了
    Iterable
    。不同的结果?对不起,这是我最初评论中的一个错误。我想从
    jsonArray
    (他的变量名)开始——我不知道它实际上是哪个类的实例,但是如果他的代码编译并运行,那么它就实现了
    Iterable
    。这个实现表明它是Iterable的。我不知道,这个实现现在是否相关,或者它是另一个正在使用的实现。这就是Gson的JsonArray,对吗?我接受了json.org的实现,我真的不知道他在用什么。据我所知,任何版本都无法使用古老的crufty
    org.json.JSONArray
    ,但无论如何我都不会使用它。你引用的公关,那家伙没有合并就关闭了它,说他不想这样,所以它仍然兼容1.4。不管他使用什么,都必须实现
    Iterable
    ,否则它根本无法编译。是的,你是对的,在官方的json.org上没有关于Iterable接口的任何信息。哪个。。。在那一页上告诉你这是可以接受的。您使用的是一个不使用泛型的古老库,它正在扩展
    ArrayList
    ,这就是为什么您必须显式地从
    Object
    强制转换,但我不能,先生。JSONArray不包含JSONObject,它们包含对象。为了确定,我又试了一次。将对象更改为JSONObject会导致:类型不匹配:无法从元素类型对象转换为JSONObject,并且我在JSONArray类中没有看到任何实现Iterable的内容:@user2100752-我们没有ESP,我们不知道您使用的库是什么。不管它是什么,它都不是您上面链接的内容,或者您的代码不会编译,更不用说运行了。@Brian:您应该重新考虑ESP,它确实会使事情更加高效。。)此外,在这个项目中,我继承了我认为是标准的JSON库,我的错。问题得到了回答。谢谢