如何理解Java中的`Iterable`和`Iterator`?

时间:2015-11-20 14:28:58

标签: java iterator

我有这些代码:

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();
                    }
                };
            }
        };
    }
}

此代码用于使ArrayList中的foreach可以反转。

有两个问题:

1,我不明白方法public Iterable<T> reversed(), 此方法的返回值为Iterable,并且还有Iterator

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

<强>可迭代:

  

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

     

来源:http://docs.oracle.com/javase/7/docs/api/java/lang/Iterable.html

<强>迭代器:

  

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

     

资料来源:PaulJWilliams回答Why is Java's Iterator not an Iterable?