首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java比较泛型类型

Java比较泛型类型
EN

Stack Overflow用户
提问于 2013-12-27 08:24:30
回答 3查看 72.3K关注 0票数 26

在Java中,我编写了一个使用递归添加节点的二进制搜索树类。现在我想使用泛型来概括它,这样我就可以学习更多关于它们的知识。

代码语言:javascript
复制
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()+" ";
    }
}

我的添加节点的函数在下面的类中

代码语言:javascript
复制
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);
    }
}

主类有以下代码来启动。我使用的是字符串,但数据类型可以是某种复杂类型。

代码语言:javascript
复制
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);

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

在寻找解决方案时,一个答案是Comparing generic types Java

代码语言:javascript
复制
class Element<T extends Comparable<T>>

我不明白这应该放在哪里,以及它与实现可比较的类有什么不同。我知道类型的唯一位置是在主类中,那么compareTo()应该在那里吗?我考虑过让GBinTree成为一个接口,但我感到困惑,这是不是正确的道路?任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-27 08:26:36

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

代码语言:javascript
复制
if (item.compareTo(bn.item) < 0) 

检查返回的值,并决定对其执行您希望的操作。

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

票数 37
EN

Stack Overflow用户

发布于 2017-06-27 15:01:31

您可以使用这种简单的方法

对于大于root.getData = 1的数据,对于等于root.getData = 0的数据,对于小于root.getData = -1的数据

代码语言:javascript
复制
public class BST<E extends Number & Comparable<? super E>>{
    void add(){
    ...
    if(data.compareTo(root.getData()) == 1)
    ...
}
票数 1
EN

Stack Overflow用户

发布于 2022-02-12 11:08:07

在编写泛型排序时遇到了这个问题。我想出的最好的解决方案是在排序函数的参数中添加一个比较器,并使用compare方法。在创建要替换为所需类型的new Comparator<T>()T时,您必须在函数调用时/之前重写compare(T o1,To2)方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20793082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档