我正在尝试建立一个通用的二叉树,二叉树的节点将由对象组成。为了插入和移动二叉树,我使用了可比较的接口,但问题是我不能创建一个二叉树对象并生成类型为“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 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
}
}
解决这个问题的正确方法是什么?我是否应该创建一个没有可比较的二叉树,但是如何在二叉树上移动,或者创建binarytreegen对象的正确方法是什么?
1条答案
按热度按时间k10s72fa1#
你面临的根本问题是:
二叉树需要甲骨文。这个预言有以下功能:给定树中存在的或正在添加到树中的任意两个对象,哪一个在另一个之前?哪个比较低?
没有这个Oracle,你就不能建立一个二叉树。
想象一下我让你把一堆弹珠放在一棵二叉树上。我把弹珠递给你,你应该称一下弹珠的重量。然而,你没有一个精确的刻度,任何两个弹珠之间的重量差异是真实的,但很小。
你不能做要求你做的工作。这是不可能的。
同样的道理也适用于这里:代码
BinTreeGen
完全不知道它怎么可能“称”一个物体。它不知道如何从任何给定的本身是“有序”的对象(如单个数字)派生属性,或者如何从给定的两个对象中确定哪个对象是“较低”的。关键是
E extends Comparable<E>
你想存储在二叉树中的东西保证是“自序的”:是一种类型的对象,保证让你调用它a.compareTo(b)
,在哪里a
以及b
是树中存储的任何对象,此方法都存在并给出合理的答案:如果“a”较低,则为负数;如果“b”较低,则为正数;如果a和b实际上是同一个对象,则为0。那么,解决办法就是用一些东西来代替
Object
(英寸BinTreeGen<Object>
)这是内在有序的。定义:实现Comparable<X>
其中x是它自己。例如:
java.lang.Integer
java.lang.Stringjava.lang.BigDecimal
如果没有这一点,问“我怎么做这个工作”就有点像问“我怎么找到一个圆的角”或者“我怎么比光速快”或者“我怎么让1+1等于3”。你在要求不可能的事。