簡體   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