Как я могу реализовать общий BST? - PullRequest
1 голос
/ 07 июля 2019

Я хочу создать общий bst, каждый узел имеет ключ и значение, методы и будут работать по ключу.Должен ли я расширить сопоставимые в классе дереваили только в классе узла?

Я попытался выяснить, нужно ли мне расширений, сопоставимых узлом, или достаточно только по ключу.


public class ThreadedGenericNode<K,V> implements Comparable<ThreadedGenericNode<K,V>>
{
    K _key;
    V _value;
    private ThreadedGenericNode _right;
    private ThreadedGenericNode _left;
    private ThreadedGenericNode _parent;
    private boolean isThreadedRight;
    private boolean isThreadedLeft;


    public ThreadedGenericNode(K key,V value)
    {
        this._right = null;
        this._left = null;
        this._parent = null;
        this.isThreadedLeft = true;
        this.isThreadedRight = true;
        this._key = key;
        this._value = value;
    }




       @Override
    public int compareTo(ThreadedGenericNode<K, V> o) {

        if(this._key > o._key)
            return 1;

        return 0;
    }


}

Я получил ошибку компиляции:«Оператор> не определен для типа (ов) аргументов K»

, поэтому я должен использовать K extends Comparable?или реализует?наконец, ключ будет целым числом, так как же это сделать?

1 Ответ

1 голос
/ 07 июля 2019

Вы не можете использовать оператор < с генериками.Если вы, например, передали String type как K, что должно произойти с использованием оператора >?Более того, во время выполнения универсальные типы стираются до Object.

. Ваш лучший выбор - убедиться, что K будет реализовывать интерфейс Comparable и использовать compareTo для вашего типа K.Таким образом, вы должны использовать ограниченный тип на вашем K:

public class ThreadedGenericNode<K extends Comparable<K>, V> implements Comparable<ThreadedGenericNode<K, V>> {
    K _key;

    .......

    @Override
    public int compareTo(ThreadedGenericNode<K, V> o) {

        return this._key.compareTo(o._key);
    }
}

Если вы скажете, что в конце K будет только целым числом - какой смысл тогда использовать дженерики?Используя дженерики, вы хотите иметь гибкость в использовании вашего класса с различными типами и при этом иметь проверку времени компиляции этих типов.

...