Подтвердить что ты не робот

Java, сравнивающая общие типы

В Java я написал класс дерева двоичного поиска, который добавляет узлы с использованием рекурсии. Теперь я хочу обобщить его с помощью Generics, чтобы я мог больше узнать о них.

public class GBinNode<T> {
    T item;
    GBinNode<T> left;
    GBinNode<T> right;

public GBinNode(T newItem) {
    item = newItem;
    left = null;
    right = null;
    }
public GBinNode(T it, GBinNode<T> le, GBinNode<T> ri) {
    item = it;
    left = le;
    right = ri;
    }
public String toString() {
    return item.toString()+" ";
    }
}

Моя функция добавления узлов находится в следующем классе

public class GBinTree<T extends Comparable <T>> {
  GBinNode<T> add(T item, GBinNode<T> bn) {
    if (bn==null) {
        return new GBinNode<T>(item, null, null);
    }
    if (item < bn.item) {        // ERROR HERE
        bn.left = add( item, bn.left);
    }
    else {
        bn.right = add( item, bn.right);
    }
    return bn;
}

public void toString(GBinNode<T> root) {
    GBinNode<T> curr = root;
    if (curr == null)
        return;
    else {
        toString(curr.left);
        System.out.println(curr.toString());    // inorder traversal
        toString(curr.right);
    }
}

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

GBinTree<String> bt = new GBinTree<String>();
    GBinNode<String> root = null;
    root = bt.add("Calex", root);
    root = bt.add("Ealex", root);
    root = bt.add("Balex", root);
    root = bt.add("Dalex", root);       
    bt.toString(root);

Я начал использовать интерфейс Comparable, но потом как написать функцию CompareTo()? Я не знаю, какой тип Т будет? Ошибка, которую я получил, это "Оператор < is undefined для типа (ов) аргумента T, T".

Поиск решения, один ответ был Сравнение общих типов Java:

class Element<T extends Comparable<T>>

Я не понимаю, куда это должно идти, и как он отличается от класса, реализующего Comparable. Единственное место, где я знаю тип, находится в основном классе, так должен ли быть compareTo()? Я посмотрел на создание интерфейса GBinTree, но смутился, правильно ли он был? Любая помощь будет оценена.

4b9b3361

Ответ 1

Вы не можете перегружать операторов на Java. Оператор < применяется только к примитивным типам, а не к ссылочным типам. Поскольку T - это переменная типа, представляющая ссылочный тип, вы не можете использовать < для переменных типа T. Вы должны использовать

if (item.compareTo(bn.item) < 0) 

проверьте возвращаемое значение и решите сделать с ним что хотите.

Вы не знаете, какой будет тип T, но вы знаете, что это будет тип, реализующий Comparable и, следовательно, реализующий метод compareTo().

Ответ 2

Вы можете использовать этот простой подход
 для данных, больших, чем root.getData = 1, для данных равно root.getData = 0, для данных, меньших, чем root.getData = -1

public class BST<E extends Number & Comparable<? super E>>{
    void add(){
    ...
    if(data.compareTo(root.getData()) == 1)
    ...
}