如何理解Java中的“Iterable”和“Iterator”?

如何理解Java中的“Iterable”和“Iterator”?,java,iterator,Java,Iterator,我有以下代码: class ReversibleArrayList<T> extends ArrayList<T> { public ReversibleArrayList(Collection<T> c) { super(c); } public Iterable<T> reversed() { return new Iterable<T>() { pu

我有以下代码:

class ReversibleArrayList<T> extends ArrayList<T> {
    public ReversibleArrayList(Collection<T> c) {
        super(c);
    }

    public Iterable<T> reversed() {
        return new Iterable<T>() {
            public Iterator<T> iterator() {
                return new Iterator<T>() {
                    int current = size() - 1;

                    @Override
                    public boolean hasNext() {
                        return current >= 0;
                    }

                    @Override
                    public T next() {
                        return get(current--);
                    }

                    @Override
                    public void remove() {
                        throw new UnsupportedOperationException();
                    }
                };
            }
        };
    }
}
类reversibleraylist扩展了ArrayList{
公共可撤销租赁清单(集合c){
超级(c);
}
公营机构{
返回新的Iterable(){
公共迭代器迭代器(){
返回新的迭代器(){
int current=size()-1;
@凌驾
公共布尔hasNext(){
返回电流>=0;
}
@凌驾
公共交通工具{
返回get(当前--);
}
@凌驾
公共空间删除(){
抛出新的UnsupportedOperationException();
}
};
}
};
}
}
此代码用于使
ArrayList
可以在
foreach
中反转

有两个问题:

1、 我不理解方法
public Iterable reversed()
, 这个方法的返回值是
Iterable
,还有
迭代器

2、 我认为,
Interable
只是一个接口,接口是否可以用于返回值?

reversed()创建并返回新的匿名类(这意味着,它创建了某个未命名类的对象,实现了Iterable),实现了Iterable接口并实现了该接口的方法迭代器()。
是的,接口可以用作返回类型,这是OOP的概念。这意味着该方法可以返回实现此接口的所有内容。

确保可以将接口用作返回类型。它只是说,objects类实现了接口,因此它的所有方法都可用。匿名类满足这些方法要求,可以用作返回类型

代码看起来很复杂,因为使用了一个匿名类,并且对象被快速连续地创建和返回

Iterable:

实现此接口允许对象成为“foreach”语句的目标

资料来源:

迭代器:

“[…]迭代器通常指向集合中的单个实例。Iterable意味着可以从对象获取迭代器以遍历其元素,并且不需要迭代单个实例,这就是迭代器所表示的。”

资料来源:PaulJWilliams回答


这对你来说应该很有用为什么你要扩展ArrayList?!你不想
ReversedList
成为
List
的装饰者吗?@Сӏаџԁаааіааааааіаааіаааааа然后使用previous():
而(list.hasPrevious()){…list.previous()…}
匿名类是推荐在java中使用的方法\?可以修改这些代码以更好地理解,例如不使用匿名类?@BlackMamba我认为在这个例子中可以,因为整个类只包含这一段代码(我假设),所以不会变得那么混乱。这只是可读性的问题:如果有什么东西变得过于拥挤,最好将代码分成两个类。