Использование сопоставимых на необработанных типах

Первый раз публикую. Не могу найти ответ, поэтому вот:

Введение. Это часть моего домашнего задания. Задание состояло в том, чтобы работать с целочисленным бинарным деревом. Первые 3 шага заключались в программировании дюжины методов для манипулирования и игры с деревом, таких как добавление новых узлов, подсчет, обход, суммирование и т. д. 4-я часть требовала создания точно такого же класса только для строк, где значения будут сравниваться с использованием метода compareTo. .

Проблема. На следующем этапе присваивания необходимо использовать полиморфизм, чтобы разрешить узлам принимать либо целое число, либо строку. Поскольку я только кратко познакомился с этим на нашей последней лекции, я обнаружил, что застрял на последние несколько часов в поисках решения, но безуспешно.

Код:

public class Node<T extends Comparable<T>> {

    T val;
    Node<T> left, right;

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

    public Node<T> insert(Node n, T v) {

        if (n == null) { 
            return new Node(v);
        }

        if (v.compareTo(n.val) == 0) {
            return n;
        }

        if (v.compareTo(n.val) < 0) {
            n.left = insert(n.left, v);
        } else {
            n.right = insert(n.right, v);
        }
        return n;
    }
    ...
}

Проблема заключается в использовании compareTo() для типов Raw. Я нигде не могу найти, как мне сравнить два объекта/необработанных типа. Я пробовал множество вариантов, обычно все с одинаковыми результатами. Отладчик постоянно напоминает мне "несовместимые типы: Comparable нельзя преобразовать в T". Как именно мне нужно реализовать Comparable, чтобы это двоичное дерево работало?


person Flo    schedule 21.06.2014    source источник
comment
Почему параметр n из insert необработан? Параметризуйте его.   -  person Sotirios Delimanolis    schedule 21.06.2014
comment
Этот API кажется необычным. Вы возвращаете узел, который вы вставили? Вы также заставляете вызывающего абонента передавать Node? Почему бы просто не передать значение вместо этого?   -  person Makoto    schedule 21.06.2014


Ответы (1)


Кажется, это так же просто, как параметризация переданного Node.

public Node<T> insert(Node<T> n, T v)

Другим решением было бы реализовать Comparable в самом Node.

public class Node<T extends Comparable<T>> implements Comparable<Node<T>> {
    // ...
}
person Makoto    schedule 21.06.2014
comment
Действительно изменение на public Node<T> insert(Node<T> n, T v) сработало. Спасибо. Реализация его в Tree.java также сработала. - person Flo; 21.06.2014