|
[J2SE 1.5]逐渐挖掘Enhanced for Loop(4) 注意,这里说的“元素的类型”,是由要被遍历的对象的决定的——如果它是一个Object[]型的数组,那么元素的类型就是Object,即使里面装的都是String对象也是如此。 4. 被这样遍历的前提 有两种类型的对象可以通过这种方法来遍历——数组和实现了Java.lang.Iterable接口的类的实例。试图将结果是其它类型的表达式放在这个位置上,只会在编译时导致一个提示信息是“foreach not applicable to eXPression type”的问题。 Java.lang.Iterable接口中定义的方法只有一个: - iterator()
- 返回一个实现了Java.util.Iterator接口的对象
而Java.util.Iterator接口中,则定义了这样三个方法: - hasNext()
- 返回是否还有没被访问过的对象
- next()
- 返回下一个没被访问过的对象
- remove()
- 把最近一次由next()返回的对象从被遍历的对象里移除。这是一个可选的操作,如果不打算提供这个功能,在实现的时候抛出一个UnsupportedOperationException即可。因为在整个循环的过程中,这个方法根本没有机会被调用,所以是否提供这个功能,在这里没有影响。
借助这两个接口,就可以自行实现能被这样遍历的类了。 清单12:一个能取出10个Object元素的类 import Java.util.*; class TenObjects implements Iterable { public Iterator iterator() { return new Iterator() { private int count = 0; public boolean hasNext() { return (count < 10); } public Object next() { return new Integer(count++); } public void remove() { throw new UnsupportedOperationException(); } }; } public static void main(String[] args) { TenObjects objects = new TenObjects(); for (Object i : objects) { System.out.println(i);/* 依次输出从“0"到“9”的十个整数 */ } } } |