我有这些代码:
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
只是一个接口,接口是否可用于返回值?
答案 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?