考虑下面这段遍历一个用户自定义的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