2013-03-19 68 views
-1

環路我看到類似下面的一行代碼:增強與陣列

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

據我所知,我認爲要能夠編寫以這種形式循環,我們需要「字」是的實現Iterable接口並覆蓋iterator()函數的類的實例。 但是'words'是String數組的類型,這個for循環格式如何糾正?

有人可以給我一些提示嗎?

+4

爲什麼不試試呢? – 2013-03-19 19:45:07

+0

@Bpache是​​你的話是一個列表,然後你可以遍歷它 – Pragnani 2013-03-19 19:46:05

+1

http://stackoverflow.com/questions/1160081/why-is-an-array-not-assignable-to-iterable – nhahtdh 2013-03-19 19:46:23

回答

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或陣列類型,或者發生編譯時錯誤。

但請注意,數組不執行Iterable;從§10.1 of the JLS

數組類型的直接超類是Object

每種陣列類型都實現了接口Cloneablejava.io.Serializable

+0

而在Java語言規範中:http://docs.oracle.com/javase/specs/jls/se5.0/html/statements.html#14.14.2 – MrLore 2013-03-19 19:51:01

1

是的,它可以迭代,就像任何實現Iterable接口的類一樣,因爲Java中的所有數組都是(使用for each循環)。據我所知,數組並沒有實現這個接口,因爲它們只是對象,然而編譯器有一些神奇的功能,並且無論如何都是這樣做的。

5

和以往一樣,Java語言規範是一個可以看的地方。在這種情況下它是section 14.14.2, the enhanced for statement

EnhancedForStatement: 
    for (FormalParameter : Expression) Statement 

類型中表達的必須是可迭代或陣列型(§10.1)或編譯時錯誤發生。

...

  • 如果表達式的類型是可迭代的子類型,那麼翻譯如下。 [...說明如何處理迭代...]

  • 否則,該表達式必須有一個數組類型T[]。 [...如何處理數組的說明...]