当前位置: 首页 > 面试题库 >

Java比较泛型类型

岳承悦
2023-03-14
问题内容

在Java中,我编写了一个Binary Search Tree类,该类使用递归添加节点。现在,我想使用泛型对其进行概括,以便我可以了解更多有关它们的信息。

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()函数?我不知道T是什么类型的?我得到的错误是“运算符<对于参数类型T,T未定义”。

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

class Element<T extends Comparable<T>>

我不知道这应该去哪里,以及与实现Comparable的类有何不同。我知道类型的唯一位置在主类中,所以compareTo()应该在那里吗?我曾考虑过将GBinTree设置为接口,但感到困惑,是否正确?任何帮助,将不胜感激。


问题答案:

您不能在Java中重载运算符。该<运算符仅适用于原始(或数字)类型,不适用于引用类型。由于T是代表引用类型的类型变量,因此不能<在type变量上使用T。你必须用

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

检查返回的值并决定使用它做您想做的事情。

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



 类似资料:
  • 问题内容: 我想比较Java中的类类型。 我以为我可以这样做: 我想比较一下是否传递给函数的obj是从MyObject_1扩展而来的。但这是行不通的。似乎getClass()方法和.class提供了不同类型的信息。 如何比较两个类类型,而不必创建另一个伪对象来比较类类型? 问题答案: 试试这个: 由于继承,这对接口也有效: 有关instanceof的更多信息,请访问:http : //mindpr

  • 问题内容: 为什么下面的代码即使 long3 == long2* 比较也返回 false ,即使它是文字。 * 问题答案: 是一个对象,而不是原始对象。通过使用您正在比较 参考值 。 您需要做: 正如您在第二次比较中所做的那样。 编辑: 我明白了…您正在考虑其他对象的行为就像文字。他们不*。即使如此,你永远要使用有任何文字。 (* Autobox类型确实实现了flyweight模式,但仅适用于-1

  • 主要内容:实例,实例虽然 PHP 是弱类型语言,但也需要明白变量类型及它们的意义,因为我们经常需要对 PHP 变量进行比较,包含松散和严格比较。 松散比较:使用两个等号 == 比较,只比较值,不比较类型。 严格比较:用三个等号 === 比较,除了比较值,也比较类型。 例如,"42" 是一个字符串而 42 是一个整数。FALSE 是一个布尔值而 "FALSE" 是一个字符串。 实例 <?php if(42 == "42

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • null 在编写代码时,什么时候应该选择关联类型而不是泛型类型参数,什么时候应该做相反的操作?

  • 我有一个关于Java仿制药的问题。假设我有以下方法: 我如何用通配符<解释上面的类型转换?扩展U>?使用它与只使用有什么区别?