增强了for数组循环

时间:2013-03-19 19:44:19

标签: java

我看到一行代码如下:

for (String w : words) sentence.add(w); // words is declared as String[] words = ...;

据我所知,我认为能够以这种格式编写for循环,我们需要'words'作为实现Iterable接口的类的实例并覆盖iterator()函数。 但'words'是String数组的类型,这对于循环格式如何正确?

有人可以给我一些提示吗?

3 个答案:

答案 0 :(得分:8)

来自Java tutorial on this subject

  

for-each构造也适用于隐藏的数组   索引变量而不是迭代器。以下方法   返回int数组中值的总和:

// Returns the sum of the elements of a
int sum(int[] a) {
    int result = 0;
    for (int i : a)
        result += i;
    return result;
}

来自§14.14.2 of the JLS(Java语言规范):

  

增强的for语句具有以下形式:

EnhancedForStatement:
    for ( FormalParameter : Expression ) Statement
     

Expression的类型必须是Iterable或数组类型,或者a   发生编译时错误。

但请注意,数组不实现Iterable;来自§10.1 of the JLS

  

数组类型的直接超类是Object

     

每个数组类型都实现接口Cloneablejava.io.Serializable

答案 1 :(得分:5)

与以往一样,Java语言规范是值得关注的地方。在这种情况下,它是section 14.14.2, the enhanced for statement

EnhancedForStatement:  
     for ( FormalParameter : Expression ) Statement
     

Expression的类型必须是Iterable或数组类型(第10.1节),否则会发生编译时错误。

     

...

     
      
  • 如果Expression的类型是Iterable的子类型,则转换如下。   [...关于如何处理迭代的描述......]

  •   
  • 否则,Expression必须具有数组类型T[]。 [...如何处理数组的描述...]

  •   

答案 2 :(得分:1)

是的,它可迭代的方式可以像任何实现Iterable接口的类一样迭代它,因为Java中的所有数组都是(使用for each循环)。据我所知,Arrays没有实现这个接口,因为它们只是对象,但是编译器做了一些魔术并且无论如何都使它工作。