Сопоставимые типы (объекты) нельзя сравнивать - PullRequest
0 голосов
/ 02 сентября 2018

Я получаю эту мистическую ошибку:

Оператор> не определен для типа (ов) аргумента java.lang. сопоставимый, java.lang. сопоставимый

Какого черта?

(вот код)

public class BST<T extends Comparable<T>> {
    public static class Node<P extends Comparable<P>> {
        P val;
        Node<P> left;
        Node<P> right;

        public Node() {

        }

        public Node(P val) {
            this.val = val;
        }
    }

    Node<T> root;

    private void addValHelper(Node root, Node newNode) {
        if (root.val > newNode.val) { // <-- ERROR IS HERE
            if (root.left == null) {
                root.left = newNode;
            } else {
                addValHelper(root.left, newNode);
            }
        } else {
            if (root.right == null) {
                root.right = newNode;
            } else {
                addValHelper(root.right, newNode);
            }
        }
    }
}

1 Ответ

0 голосов
/ 02 сентября 2018

В Java нет перегрузки операторов. Вы не можете сравнивать сопоставимые типы с >. Вам нужно использовать root.val.compareTo(newNode.val) вместо.

В сторону:

  • Comparable - это интерфейс, а не класс
  • Вам не нужно указывать <P extends Comparable<P>>
  • Возможно, имеет смысл переместить код addValHelper в сам класс Node
  • Возможно, Node имеет смысл реализовать Comparable.

Таким образом, ваш код выглядит намного более идиоматичным, и вы не выставляете поля Node для BST.

public class BST<T implements Comparable<T>> {
    private final Node<T> root;

    /** Presumably this is run when a value is added.. */
    private void addValueHelper(Node rootNode, Node newNode) {
        rootNode.attachChild(newNode);
    }

    public static class Node implements Comparable<T> {
        private final T val;
        private Node left;
        private Node right;

        public Node(T val) {
            this.val = val;
        }

        public int compareTo(Node other) {
            return this.val.compareTo(other.val);
        }

        /**
         * Takes the given node and compares it with the current node.
         * If the current node is greater than the given node, the given node is placed to the left.
         * Otherwise it is placed to the right.
         */
        protected void attachChild(Node newNode) {
            if (this.compareTo(newNode) == 1) {
                if (this.left == null) {
                    this.left = newNode;
                    return;
                }
                this.left.attachChild(newNode);
                return;
            } 

            if (this.right == null) {
                this.right = newNode;
                return;
            }

            this.right.attachChild(newNode);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...