繁体   English   中英

如何正确扩展此抽象类?

[英]How do I properly extend this abstract class?

嗨,我对Java没有经验。 我了解继承的概念,但我认为语法使我难以理解。 我正在寻求帮助,以开始扩展这个抽象类:我需要从中创建一个具体对象。

此类应做的是在初始化期间接受一种类型,并存储该类型的对象的列表。 对它们进行排序,然后在调用showTopN时返回n个顶级对象的列表。

我尚未开始实施逻辑。

abstract class Foo<T extends Comparable<T>> {
    int n;

    Foo(int n){ // constructor; sets object property n
        this.n = n;
    }

    abstract void push(T object); //object method to store a new object in the list

    abstract List<T> showTopN(); // object method to return top n entries in the list, sorted.
}

我试图以此方式将其扩展为具体对象:

class ConcreteFoo extends Foo {

        private List<Foo> fooList;

        public void push(Foo object) {

        }

        @Override
        public List<Foo> showTopN() {
            return fooList;
        }

        @Override
        public int compareTo(ConcreteFoo other) {
            return 0;
        }
}

但是编译器抱怨我没有重写push方法。 怎么了?

这里有两件事。 一种是Foo的“抽象性”,另一种是泛型。 您已经忽略了泛型方面。

如果您知道您的Concrete foo关心的对象类型,则可以使用:

class ConcreteFoo extends Foo<SomeKnownClass> {
    private List<SomeKnownClass> list = new ArrayList<SomeKnownClass>();
    void push(SomeKnownClass skc) {}
    List<SomeKnownClass> showTopN() { return list; }
}

现在,如果您知道其类型,则仍然可以使用泛型:

class ConcreteFoo<T extends Comparable<T>> extends Foo<T> {
    private List<T> list = new ArrayList<T>();
    void push(T skc) {}
    List<T> showTopN() { return list; }
}

请注意, FooConcreteFoo都未实现Comparable,因此您不需要compareTo方法。

push方法指定它将接受T对象,这是Foo的泛型类型,尚未声明。 如果您想让Foo成为其自身的List ,但我不确定您是否这样做,则必须将其声明为

 class ConcreteFoo extends Foo<Foo> {

但是我认为您需要重新检查您的基本原则。

您正在将容器与其包含的对象进行合并。 您想要的类结构如下所示:

class Foo implements Comparable<Foo> { ... }

abstract class GenericContainer<T> {
    abstract void push(T object); //object method to store a new object in the list

    abstract List<T> showTopN(); // object method to return top k entries in the list, sorted.
}


class FooContainer extends GenericContainer<Foo> {
    private List<Foo> fooList;
    ...
}

然后,您的showTopN方法可以类似于:

public List<Foo> showTopN() {
    return Collections.sort(fooList).subList(0, n);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM