繁体   English   中英

Java Generics - 绑定不匹配:类型 Object 不是绑定参数的有效替代品<e extends comparable<e> &gt;</e>

[英]Java Generics - Bound mismatch: The type Object is not a valid substitute for the bounded parameter <E extends Comparable<E>>

我正在尝试制作通用二叉树,并且二叉树的节点将由对象组成。 为了插入和移动二叉树,我使用 Comparable 接口,但问题是我无法创建二叉树 Object 并制作“对象”类型的 Generics。

二叉树:

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

主要class:

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
    }
}

解决这个问题的正确方法是什么? 我应该在没有 Comparable 的情况下创建二叉树,但是如何在二叉树中移动,或者创建 BinaryTreeGen Object 的正确方法是什么?

您遇到的基本问题是:

二叉树需要 oracle。 此 oracle 具有以下 function: 给定任意 2 个对象,它们要么存在于树中,要么正在添加到树中,哪一个在另一个之前 哪个“低”?

没有这个 oracle,你就不能制作二叉树。

想象一下,我让你在一棵二叉树中布置一堆弹珠。 我递给你弹珠,你应该通过称量弹珠来做到这一点。 但是,您没有准确的秤,并且任何 2 颗弹珠之间的重量差异是真实的,但很小。

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

这同样适用于这里: BinTreeGen的代码完全不知道它怎么可能“称重”object。 它不知道如何从任何给定的 object 派生一个属性,该属性本身是“有序的”(例如单个数字),或者如何在给定 2 个对象的情况下确定哪个是“较低的”。

E extends Comparable<E>的要点是,您要存储在二叉树中的东西保证是“自排序的”:成为保证让您调用a.compareTo(b)的类型的对象,其中ab是存储在树中的任何对象,并且此方法都存在并给出合理的答案:如果“a”较低,则为负数,如果“b”较低,则为正数,如果 a 和 b 为 0实际上同样的 object。

那么,解决方法是使用一些东西来代替固有排序的Object (在BinTreeGen<Object>中)。 定义为:它实现了Comparable<X> ,其中 X 是它本身。

一些例子是:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM