Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型绑定不匹配:类型对象不是绑定参数的有效替代品<;E可比<;E>&燃气轮机;_Java_Generics - Fatal编程技术网

Java泛型绑定不匹配:类型对象不是绑定参数的有效替代品<;E可比<;E>&燃气轮机;

Java泛型绑定不匹配:类型对象不是绑定参数的有效替代品<;E可比<;E>&燃气轮机;,java,generics,Java,Generics,我正在尝试创建一个通用的二叉树,二叉树的节点将由对象组成。为了插入和移动二叉树,我使用了可比较的接口,但问题是我无法创建二叉树对象并生成类型为“Object”的泛型 二叉树: public class BinTreeGen<E extends Comparable<E>> implements BinTreeGenInterface<E> { private BinNodeGen<E> root = null; BinTreeGe

我正在尝试创建一个通用的二叉树,二叉树的节点将由对象组成。为了插入和移动二叉树,我使用了可比较的接口,但问题是我无法创建二叉树对象并生成类型为“Object”的泛型

二叉树:

public class BinTreeGen<E extends Comparable<E>> implements BinTreeGenInterface<E> {
    private BinNodeGen<E> root = null;

    BinTreeGen() {
        root = null;
    }

    BinTreeGen(BinNodeGen<E> root) {
        this.root = root;
    }
}
public类BinTreeGen实现bintreegenterface{
私有BinNodeGen root=null;
宾特列根(){
root=null;
}
BinTreeGen(BinNodeGen根){
this.root=根;
}
}
主要类别:

public class Main {
    public static void main(String[] args) {
        BinTreeGen<Object> btg = new BinTreeGen<>(); //Bound mismatch: The type Object is not a valid substitute for the bounded parameter <E extends Comparable<E>> of the type
    }
}
公共类主{
公共静态void main(字符串[]args){
BinTreeGen btg=new BinTreeGen();//绑定不匹配:类型对象不是类型的绑定参数的有效替代物
}
}

解决这个问题的正确方法是什么?我是否应该创建一个没有可比较对象的二叉树,但如何在二叉树上移动,或者创建BinaryTreeGen对象的正确方法是什么?

您遇到的基本问题是:

二叉树需要oracle。此oracle具有以下功能:给定树中存在的或正在添加到树中的任意两个对象,哪个在另一个之前?哪一个较低

没有这个甲骨文,你就无法生成二叉树

想象一下,我让你把一堆大理石放在一棵二叉树上。我把弹珠递给你,你应该称一下弹珠的重量。然而,你没有一个精确的刻度,任何两个弹珠之间的重量差都是真实的,只是一分钟

你不能做要求你做的工作。这是不可能的

这一点在这里也同样适用:BinTreeGen的代码绝对不知道它如何“称量”一个物体。它不知道如何从自身“有序”(如单个数字)的任何给定对象派生属性,也不知道如何从给定的两个对象派生属性来确定哪一个“较低”

E扩展可比较的
的要点是,您要存储在二叉树中的东西保证是“自序的”:是保证允许您调用
a.compareTo(b)
的类型的对象,其中
a
b
是树中存储的任何对象,这个方法既存在又给出了合理的答案:如果“A”较低,则为负数;如果“b”较低,则为正数;如果A和b实际上是同一个对象,则为0

因此,解决方法是使用某种东西,而不是
对象(在
BinTreeGen
中),后者本质上是有序的。定义如下:它实现了
可比
,其中X本身就是X

例如:

  • java.lang.Integer
  • java.lang.String
  • java.lang.BigDecimal

如果没有这一点,问“我如何使这项工作”就有点像问:“我如何找到一个圆的角”或“我如何比光速快”或“我如何使1+1等于3”。你是在要求不可能的东西。

你想在btg中存储什么特定类型的对象?您不能存储泛型
对象
因为
对象
未实现
可比
,但如果您选择更具体的对象,如
字符串
整型
,它将起作用。我创建了一个类Person,用于存储此人的姓名和年龄,并希望在二进制树中使用该类Person。如果没有可比性,可以创建二进制树,但我不知道如何在二进制树周围移动,然后使其成为
BinTreeGen btg
。同样的错误。。。但我相信我发现了我的错误。我不想创建Person类型的二叉树,而是创建节点。所以这应该行得通。但是感谢您抽出时间,一般来说,您确实希望使二叉树类型与其节点类型相同;您不希望最大化“n”个匹配类型