我看到了如下一行代码:
for (String w : words) sentence.add(w); // words is declared as String[] words = ...;
据我所知,我认为为了能够以这种格式编写 for 循环,我们需要“单词”作为实现 Iterable 接口并覆盖 iterator() 函数的类的实例。但是 'words' 是字符串数组类型,这个 for 循环格式怎么能正确呢?
有人可以给我一些建议吗?
我看到了如下一行代码:
for (String w : words) sentence.add(w); // words is declared as String[] words = ...;
据我所知,我认为为了能够以这种格式编写 for 循环,我们需要“单词”作为实现 Iterable 接口并覆盖 iterator() 函数的类的实例。但是 'words' 是字符串数组类型,这个 for 循环格式怎么能正确呢?
有人可以给我一些建议吗?
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(Java 语言规范)的 §14.14.2:
增强的 for 语句具有以下形式:
EnhancedForStatement: for ( FormalParameter : Expression ) Statement
的类型
Expression
必须是Iterable
或数组类型,否则会发生编译时错误。
但请注意,数组不实现Iterable
;来自JLS 的§10.1:
数组类型的直接超类是
Object
.每个数组类型都实现了接口
Cloneable
和java.io.Serializable
.
与以往一样,Java 语言规范是值得一看的地方。在这种情况下,它是第 14.14.2 节,增强for
语句:
EnhancedForStatement: for ( FormalParameter : Expression ) Statement
Expression 的类型必须是 Iterable 或数组类型(第 10.1 节),否则会发生编译时错误。
...
如果 Expression 的类型是 Iterable 的子类型,那么翻译如下。[...描述如何处理迭代...]
否则,表达式必须具有数组类型,
T[]
。[...描述如何处理数组...]
是的,它是可迭代的,您可以像实现 Iterable 接口的任何类一样对其进行迭代,就像 Java 中的所有数组一样(使用 for each 循环)。据我所知,数组并没有实现这个接口,因为它们只是对象,但是编译器做了一些神奇的事情并让它工作。