考慮下面這段遍歷一個用戶自定義的aggregator或collection類的代碼,這段代碼將會打印出什麼,拋出異常仍是編譯器錯誤:java
package javaForEach; /** * Java Class to show how for-each loop works in Java */ public class ForEachTest { public static void main(String args[]){ CustomCollection<String> myCollection = new CustomCollection<String>(); myCollection.add("Java"); myCollection.add("Scala"); myCollection.add("Groovy"); //What does this code will do, print language, throw exception or compile time error for(String language: myCollection){ System.out.println(language); } } }
package javaForEach; import java.util.ArrayList; public class CustomCollection<T>{ private ArrayList<T> bucket; public CustomCollection(){ bucket = new ArrayList<T>(); } public int size() { return bucket.size(); } public boolean isEmpty() { return bucket.isEmpty(); } public boolean contains(T o) { return bucket.contains(o); } public boolean add(T e) { return bucket.add(e); } public boolean remove(T o) { return bucket.remove(o); } }
答案:oop
上述代碼將沒法經過編譯,這是由於咱們的CustomCollection類沒有實現java.lang.Iterable接口,編譯期錯誤以下:this
Description Resource Path Location Type
Can only iterate over an array or an instance of java.lang.Iterable ForEachTest.java /DataSortAndJAVABasic/src/javaForEach line 15 Java Problem
從中瞭解到的一個有趣的事實是:for-each循環僅應用於實現了Iterable接口的Java array和Collection類,並且既然全部內置Collection類都實現了java.util.Collection接口,已經繼承了 Iterable,這一細節一般會被忽略,這點能夠在Collection接口的類型聲明「 public interface Collection extends Iterable」中看到。因此爲了解決上述問題,你能夠選擇簡單地讓CustomCollection實現Collection接口或者繼承 AbstractCollection,這是默認的通用實現並展現瞭如何同時使用抽象類和接口以獲取更好的靈活性。
code