继承的抽象颜色-感到困惑吗?

时间:2018-12-30 15:31:20

标签: java arrays eclipse

错误图片1 Error picture 1

错误图片2 Error picture 2

您好,我一直收到此错误,我完全不理解,非常感谢您的帮助。

谢谢

2 个答案:

答案 0 :(得分:2)

Iterable接口,这是Java中的一种特殊引用类型,它定义了必须由实现它的所有类实现的方法的约定。

对于Iterable,有一种这样的方法,iterator。此方法返回一个Iterator对象,该对象将定义类实例上迭代的确切性质。

由于这个原因,尝试将implements Iterable<Name>添加到您的类中而不指定iterator()方法的实现会导致编译错误。

另一种选择是通过在类声明中的abstract之前添加class关键字,将该类声明为抽象类。 无法直接创建抽象类的实例,因此抽象类不必直接从接口实现方法。但是,任何从此类抽象类继承的类都必须从该接口实现方法,或者也必须声明为抽象。


在您的特定情况下,答案将取决于班级代码和您的要求。我建议您使用Register类的代码来编辑问题,以便提出更具体的解决方案。 如果将Name对象存储在列表(或任何其他Collection数据结构)的Register类中,则可能与使用列表的迭代器方法一样简单:

public class Register implements Iterable<Name> {

    private List<Name> allNames = new List<>();

    @Override
        public Iterator<Name> iterator() {
            return allNames.iterator();
        }
}

之所以可行,是因为在这种情况下,List类已经包含了iterator()方法的实现,因此可以直接调用它。

答案 1 :(得分:0)

编译器说您必须实现Iterator<String> iterator()方法或使Register类成为抽象,并实现Iterator<String> iterator()方法,这在继承链中较低的位置。

意思是,如果要注册可迭代的类,则必须遵守其合同,并提供一种获取该类迭代器的方法。

Iterator<String> iterator()实现中,您应该提供一个迭代器本身。其中一种方法是从您的私有列表类成员中返回迭代器,这可能会这样做:

public class Register implements Iterable<Name> {

    private List<Name> names = new ArrayList<Name>();

    @Override
    public Iterator<String> iterator() {
        return names.iterator();
    }

}