增强了for array的循环

我看到一行代码如下:

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

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

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

从关于这个主题的Java教程 :

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; } 

从JLS的§14.14.2 (Java语言规范):

增强的for语句具有以下forms:

 EnhancedForStatement: for ( FormalParameter : Expression ) Statement 

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

但请注意,数组不实现Iterable ; 来自JLS的第10.1节 :

数组类型的直接超类是Object

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

与以往一样,Java语言规范是值得关注的地方。 在这种情况下,它是第14.14.2节,增强for声明 :

 EnhancedForStatement: for ( FormalParameter : Expression ) Statement 

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

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

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

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