Java比较泛型类型

Ale*_*x_B 20 java generics

在Java中,我编写了一个二进制搜索树类,它使用递归添加节点.现在我想使用泛型来概括它,以便我可以更多地了解它们.

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()+" ";
    }
}
Run Code Online (Sandbox Code Playgroud)

我添加节点的功能在以下类中

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

主类有以下代码来启动.我正在使用字符串,但数据类型可能是一些复杂的类型.

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);
Run Code Online (Sandbox Code Playgroud)

我开始使用Comparable接口但是如何编写CompareTo()函数?我不知道T会是什么类型的?我得到的错误是"操作符<未定义参数类型T,T".

在寻找解决方案时,一个答案是比较泛型类型Java:

class Element<T extends Comparable<T>>
Run Code Online (Sandbox Code Playgroud)

我不明白这应该去哪里,以及它与实现Comparable的类有什么不同.我知道类型的唯一地方是在主类中,所以compareTo()应该在那里吗?我看着让GBinTree成为一个界面,但是对于这是否是正确的轨道感到困惑?任何帮助,将不胜感激.

Sot*_*lis 27

您不能在Java中重载运算符.该<操作仅适用于原始类型,而不是引用类型.由于T是表示引用类型的类型变量,因此不能<对类型的变量使用T.你必须使用

if (item.compareTo(bn.item) < 0) 
Run Code Online (Sandbox Code Playgroud)

检查返回的值并决定用它做你想做的事情.

您不知道类型T是什么,但您知道它将是一个实现Comparable并因此实现该compareTo()方法的类型.

  • OP的最后一段有关OP的好处:基本上,你作为实现`GBinNode <T extends Comparable <T >>`的人不负责实现compareTo,无论是谁使用你的代码来确保无论是谁`T`是,它已经实现了该方法.否则,代码甚至不会编译. (10认同)