首页 > 解决方案 > 这个关键字不代表一个对象

问题描述

有谁知道为什么我们可以在这里循环“this”关键字(在subsetOf方法中)?据我所知,这代表一个 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;
    }
}

标签: java

解决方案


您正在声明一个实现接口的类,该Set 接口本身Iterable通过Collection接口扩展。作为接口实现的任何对象Iterable都可以在 for-each 循环中使用。

因此,您的类的继承层次结构是这样的:

 Iterable
    ^
    |
Collection
    ^
    |
   Set
    ^
    |
ArrayListSet

此外,this关键字始终指代当前实例。在您的代码中,当您执行时subsetOf()this将指向一个实例ArrayListSet(用于调用subSetOf()方法),这是一种Iterable通过继承,因此您可以在 for-each 循环中使用它。

此外,由于您正在实现 a Set,因此您需要提供接口中Iterator<E> iterator();定义的方法的Set实现以使其成为Iterable.

由于Iterable接口的实现需要一个iterator()返回Iterator对象实例的方法。for-each 循环将Iterator使用 Object 来遍历ArrayListSet.

Iterator从方法返回的类型的实现iterator()实际上定义了 for-each 循环使用的迭代逻辑。

在 for-each 循环中使用任何对象:

第一步:Iterable直接扩展或通过其他Iterable类型扩展。

第 2 步:提供从接口Iterator iterator()继承的方法的实现。Iterable

第 3 步:实现一个并从该方法Iterator返回其实例。iterator()


推荐阅读