>有谁知道为什么我们可以在这里循环访问"this"关键字(在subsetOf 方法中(?据我所知,这代表了一个 JAVA 对象。欢迎一些广泛的解释,想知道为什么"这个"可以以这种方式工作。
public class ArrayListSet<E> implements Set<E> {
private ArrayList<E> elements;
public ArrayListSet() {
elements = new ArrayList<>();
}
@Override
public void add(E e) {
if (!elements.contains(e))
elements.add(e);
}
@Override
public void remove(E e) {
elements.remove(e);
}
@Override
public boolean contains(Object e) {
return elements.contains(e);
}
@Override
public int size() {
return elements.size();
}
@Override
public boolean subsetOf(Set<?> other) {
for (E e : this) {
if (!other.contains(e))
return false;
}
return true;
}
}
您正在声明一个实现Set
接口的类,该接口本身通过Collection
接口扩展了Iterable
。任何作为Iterable
接口实现的对象都可以在 for-each 循环中使用。
因此,继承层次结构适用于您的类:
Iterable
^
|
Collection
^
|
Set
^
|
ArrayListSet
此外,this
关键字始终引用当前实例。在代码中执行subsetOf()
时,this
将指向ArrayListSet
的实例(用于调用subSetOf()
方法(,该实例是一种通过继承Iterable
,因此您可以在 for-each 循环中使用它。
此外,由于您正在实现Set
因此您需要提供Set
接口中定义的Iterator<E> iterator();
方法的实现,以使其成为Iterable
。
由于Iterable
接口的实现需要一个返回Iterator
对象的实例的iterator()
方法。for-each 循环将使用Iterator
对象来迭代ArrayListSet
的元素。
从iterator()
方法返回的Iterator
类型的实现实际上定义了 for-each 循环使用的迭代逻辑。
要在 for-each 循环中使用任何对象,请执行以下操作:
第 1 步:直接或通过其他Iterable
类型扩展Iterable
。
步骤 2:提供从Iterable
接口继承的Iterator iterator()
方法的实现。
步骤 3:实现Iterator
并从iterator()
方法返回其实例。
您可以遍历它,因为它表示一个集合。该集合是可迭代的。因此,它是有效的语法。