Java 抽象类方法

3

我在一项声明抽象类的练习中遇到了这段代码:

import java.util.ArrayList;

public abstract class Box {

    public abstract void add(Item item);

    public void add(ArrayList<Item> items) {
        for (Item item : items) {
            Box.this.add(item);
        }
    }

    public abstract boolean isInBox(Item item);
}

我不理解add(ArrayList<Item> item)方法的作用。我知道它会遍历一个名为items的ArrayList,但是Box.this.add(item)的作用是什么呢?有人能解释一下吗?


5
在这种情况下,它与this.add(item)或只有add(item)是相同的。开发人员只是决定对方法调用进行超出通常的限定。 - ernest_k
2
基本上:风格不佳。请注意:这种不良风格仍在继续,如果该方法add(ArrayList<Item> items)被命名为addAll(List<T> items),那么它将会更好得多。1)避免混淆add()和addAll()... 2)使用接口List而不是某些实现类型ArrayList...使Box类本身成为通用的。 - GhostCat
1
整个 Box 可以是一个接口。 - MC Emperor
2个回答

4

除了@ernest_k在评论中写的内容之外,实际上还有一个使用案例需要像这样使用类名来限定方法调用:如果您在访问其外部类字段的方法中创建一个匿名内部类,就像以下任意(在现实中相当无用)示例:

import java.util.ArrayList;

public abstract class Box {

    public abstract void add(String item);

    public void add(ArrayList<String> items) {
        for (String item : items) {
            Runnable r = new Runnable() {

                @Override
                public void run() {
                    add(item); // works, implicitly accesses Box.this.add
                    this.add(item); // does not work as "add" is not a method of the anonymous runnable
                    Box.this.add(item); // works
                }
            };
            r.run();
        }
    }

    public abstract boolean isInBox(String item);
}


0

该类声明了一个带有一些代码的接口。具体来说,它声明了一个没有详细实现的Box,您可以稍后使用适合您需求的基础代码创建Box

例如,您可以声明BoxOnSet类,并使用HashSet<>实现该声明:

public abstract class BoxOnSet extends Box {
    public BoxOnSet()
    {
        this.items = new HashSet<>();
    }

    public void add(Item item)
    {
        this.items.add( item );
    }


    public boolean isInBox(Item item)
    {
        return this.items.contains( item );
    }

    private HashSet<Item> items;
}

关于您的具体问题,add(ArrayList<>) 方法相当于集合的 addAll() 方法。它只是使用抽象的 add(Item) 来插入Box中的项目。您可以指定 add( item )this.add( item ) 或甚至 Box.this.add( item ),在这个例子中它们都指向同一个方法,只是进一步指定的方式不同。

用户主要询问关于奇怪的Box的语法... - GhostCat
Box的抽象类声明中不包含任何ArrayList。我想知道要添加什么项。 - Ramkay
@Ramkay,ArrayList是第二个add()方法的参数,它应该被命名为addAll()或类似的名称,以使其明显地执行扩展操作。Box类是抽象的,因此由派生类决定添加哪些Item - Baltasarq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接