環路我看到類似下面的一行代碼:增強與陣列
for (String w : words) sentence.add(w); // words is declared as String[] words = ...;
據我所知,我認爲要能夠編寫以這種形式循環,我們需要「字」是的實現Iterable接口並覆蓋iterator()函數的類的實例。 但是'words'是String數組的類型,這個for循環格式如何糾正?
有人可以給我一些提示嗎?
環路我看到類似下面的一行代碼:增強與陣列
for (String w : words) sentence.add(w); // words is declared as String[] words = ...;
據我所知,我認爲要能夠編寫以這種形式循環,我們需要「字」是的實現Iterable接口並覆蓋iterator()函數的類的實例。 但是'words'是String數組的類型,這個for循環格式如何糾正?
有人可以給我一些提示嗎?
從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
或陣列類型,或者發生編譯時錯誤。
但請注意,數組不執行Iterable
;從§10.1 of the JLS:
數組類型的直接超類是
Object
。每種陣列類型都實現了接口
Cloneable
和java.io.Serializable
。
而在Java語言規範中:http://docs.oracle.com/javase/specs/jls/se5.0/html/statements.html#14.14.2 – MrLore 2013-03-19 19:51:01
是的,它可以迭代,就像任何實現Iterable接口的類一樣,因爲Java中的所有數組都是(使用for each循環)。據我所知,數組並沒有實現這個接口,因爲它們只是對象,然而編譯器有一些神奇的功能,並且無論如何都是這樣做的。
和以往一樣,Java語言規範是一個可以看的地方。在這種情況下它是section 14.14.2, the enhanced for
statement:
EnhancedForStatement: for (FormalParameter : Expression) Statement
類型中表達的必須是可迭代或陣列型(§10.1)或編譯時錯誤發生。
...
如果表達式的類型是可迭代的子類型,那麼翻譯如下。 [...說明如何處理迭代...]
否則,該表達式必須有一個數組類型
T[]
。 [...如何處理數組的說明...]
爲什麼不試試呢? – 2013-03-19 19:45:07
@Bpache是你的話是一個列表,然後你可以遍歷它 – Pragnani 2013-03-19 19:46:05
http://stackoverflow.com/questions/1160081/why-is-an-array-not-assignable-to-iterable – nhahtdh 2013-03-19 19:46:23