有人知道为什么我们可以在此处(在subsetOf方法中)遍历“ this”关键字吗?据我所知,这表示一个JAVA对象。欢迎进行一些广泛的解释,想知道为什么“ this”可以这样工作。
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;
}
}
答案 0 :(得分:8)
您要声明一个实现Set
接口的类,该类本身通过Iterable
接口扩展Collection
。任何实现Iterable
接口的对象都可以在for-each循环内使用。
因此,您的类的继承层次结构是这样的:
Iterable
^
|
Collection
^
|
Set
^
|
ArrayListSet
此外,this
关键字始终引用当前实例。在您的代码中,当您执行subsetOf()
时,this
会指向ArrayListSet
的实例(用于调用subSetOf()
方法),它是{{ 1}}继承,因此您可以在for-each循环中使用它。
此外,由于要实现Iterable
,因此需要提供在Set
接口中定义的Iterator<E> iterator();
方法的实现,以使其成为Set
。
由于Iterable
接口的实现需要一个Iterable
方法,该方法返回iterator()
对象的实例。 Iterator
对象将被for-each循环使用,以迭代Iterator
的元素。
从ArrayListSet
方法返回的Iterator
类型的实现实际上定义了for-each循环使用的迭代逻辑。
要在for-each循环中使用任何对象:
步骤1:直接扩展iterator()
或通过其他Iterable
类型扩展。
第2步:提供从Iterable
接口继承的Iterator iterator()
方法的实现。
第3步:实现Iterable
并从Iterator
方法返回其实例。
答案 1 :(得分:1)