import java.util.*;class ReversibleArrayList<T> extends ArrayList<T> { //问题1:这里为什么要继承ArrayList?是因为下面要调用它的 iterator 方法? public ReversibleArrayList(Collection<T> c) { super(c); } public Iterable<T> reversed() { //问题2:这里为什么要在iterator外面套一个iterable? return new Iterable<T>() { public Iterator<T> iterator() { return new Iterator<T>() { int current = size() - 1; //问题3:这里的size()是ArrayList中的方法,为什么这里要 -1呢? public boolean hasNext() { return current > -1; } public T next() { return get(current--); } public void remove() { throw new UnsupportedOperationException(); } }; } }; } } public class AdapterMethodIdiom { public static void main(String[] args) { ReversibleArrayList<String> ral = new ReversibleArrayList<String>( Arrays.asList("To be or not to be".split(" "))); for(String s : ral) System.out.print(s + " "); System.out.println(); for(String s : ral.reversed()) System.out.print(s + " "); } }
public ReversibleArrayList(Collection<T> c) { super(c); }
public Iterable<T> reversed() { //问题2:这里为什么要在iterator外面套一个iterable?
return new Iterable<T>() {
public Iterator<T> iterator() {
return new Iterator<T>() {
int current = size() - 1; //问题3:这里的size()是ArrayList中的方法,为什么这里要 -1呢?
public boolean hasNext() { return current > -1; }
public T next() { return get(current--); }
public void remove() {
throw new UnsupportedOperationException();
}
};
}
};
}
} public class AdapterMethodIdiom {
public static void main(String[] args) {
ReversibleArrayList<String> ral =
new ReversibleArrayList<String>(
Arrays.asList("To be or not to be".split(" ")));
for(String s : ral)
System.out.print(s + " ");
System.out.println();
for(String s : ral.reversed())
System.out.print(s + " ");
}
}
问题二:Iterable是个接口
问题三:你不是要倒序输出一个ArrayList吗?当然从最后一个开始了 不要告诉我 你不知道Java是从0开始计数的
Iterable<T>只是方法的返回类型,你是不是想的太多了?
第二个问题:之所以在这里套一个Iterable接口是因为,如果直接写Iterator方法,那么编译器就会调用这个重载的方法了,但是我们希望的是能够进行向前和向后2个功能,所以不能直接写Iterator方法,而是通过调用Iterable来生成一个Iterator以实现Foreach循环。
第三个问题:这确实是因为,自己没有考虑而出的洋相(昨天晚上,牙实在太疼了应该是过了止痛片的药效,所以没考虑就拿出来问了)。