0

我看到了如下一行代码:

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

据我所知,我认为为了能够以这种格式编写 for 循环,我们需要“单词”作为实现 Iterable 接口并覆盖 iterator() 函数的类的实例。但是 'words' 是字符串数组类型,这个 for 循环格式怎么能正确呢?

有人可以给我一些建议吗?

4

3 回答 3

9

来自关于这个主题的 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(Java 语言规范)的 §14.14.2:

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

EnhancedForStatement:
    for ( FormalParameter : Expression ) Statement

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

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

数组类型的直接超类是Object.

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

于 2013-03-19T19:46:25.810 回答
5

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

EnhancedForStatement:  
     for ( FormalParameter : Expression ) Statement

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

...

  • 如果 Expression 的类型是 Iterable 的子类型,那么翻译如下。[...描述如何处理迭代...]

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

于 2013-03-19T19:51:10.717 回答
1

是的,它是可迭代的,您可以像实现 Iterable 接口的任何类一样对其进行迭代,就像 Java 中的所有数组一样(使用 for each 循环)。据我所知,数组并没有实现这个接口,因为它们只是对象,但是编译器做了一些神奇的事情并让它工作。

于 2013-03-19T19:46:28.900 回答