Java 比较泛型类型

2022-09-01 11:56:03

在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()+" ";
    }
}

我的添加节点的函数位于以下类中

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);

我开始使用Compable接口,但是如何编写CompareTo()函数?我不知道T会是什么类型?我得到的错误是“参数类型T,T的运算符<未定义”。

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

class Element<T extends Comparable<T>>

我不明白这应该去哪里,以及它与实现Compable的类有何不同。我唯一知道类型的地方是在主类中,那么compareTo()应该在那里吗?我考虑过将GBinTree作为一个界面,但感到困惑这是否是正确的轨道?任何帮助将不胜感激。


答案 1

在 Java 中不能重载运算符。运算符仅适用于基元(或数值)类型,而不适用于引用类型。由于 是表示引用类型的类型变量,因此不能在 类型的变量上使用。您必须使用<T<T

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

检查返回的值,并决定使用它执行所需的操作。

您不知道该类型将是什么,但您知道它将是实现并因此实现该方法的类型。TComparablecompareTo()


答案 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)
    ...
}

推荐