簡體   English   中英

在通用 java 數據結構中擴展 class 和可比較

[英]extending a class AND comparable in a generic java data structure

對於家庭作業,我被分配制作一個 AVL 樹數據結構。 我正在嘗試使我的“添加”方法將一條通用數據添加到樹中。 我的問題是,在作業中,我們必須擴展一個 class,它被稱為“BinaryTree”。 在我的 add 方法中,我需要使用 compareTo 方法,我相信這意味着我還必須擴展 Comparable。 我在網上看過,顯然你不能擴展兩個類,所以這成了一個問題。 我決定嘗試在我的 AVL 樹 class 中編寫自己的 compareTo 方法,但它說 < 和 > 不能應用於我的泛型類型。 任何提示或快速解決方法? 還是我只是愚蠢?

謝謝 - 史蒂夫

Java 不支持多個 inheritance。 但是,您不需要擴展Comparable,您需要實現Comparable。 Comparable是一個接口。 您不擴展接口,而是實現它。

希望這可以幫助。

下面的一個例子: -

public final class AVL implements Comparable<SomeObject> extends BinaryTree

您可以使用 Generics 來指定類型並要求它實現 Comparable。 這樣您就可以訪問 AVL 樹中的 type 和 compareTo()。

public class AVL<T extends Comparable<T>> extends BinaryTree {

    public void add(T object) {
            ...
        object.compareTo(some other object)
            ...
    }
}

然后您將其創建為AVL<MyObject> avl = new AVL<MyObject>()

首先, java.lang.Comparable是一個接口,不是一個class。 Java 只允許你擴展一個 class,但是你可以實現任意數量的接口,所以這樣做是完全有效的:

public class MyTreeImpl extends BinaryTree implements Comparable<MyTreeImpl> {

    @Override
    public int compareTo(MyTreeImpl o) {
        // your compare implementation
    }

    // the rest of your class definition
}

為了解決 generics 的問題,我想我需要查看您的代碼以及編譯器給您的確切錯誤。

您通常希望將樹中的鍵相互比較,而不是一棵樹與另一棵樹或一個鍵進行比較。

因此,您的鍵對象應該實現Comparable或更好的Comparable<K> ,其中K是鍵的某種超類型。

這通常意味着您將 AVLTree class 聲明為通用:

class AVLTree<K extends Comparable<? super K>, V> extends BinaryTree {

   ...

}

我不太了解與您的 BinaryTree class 的關系,抱歉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM