我看到一行代码如下:
for (String w : words) sentence.add(w); // words is declared as String[] words = ...;
据我所知,我认为能够以这种格式编写for循环,我们需要'words'作为实现Iterable接口的类的实例并覆盖iterator()函数。 但'words'是String数组的类型,这对于循环格式如何正确?
有人可以给我一些提示吗?
答案 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
。每个数组类型都实现接口
Cloneable
和java.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没有实现这个接口,因为它们只是对象,但是编译器做了一些魔术并且无论如何都使它工作。