当前位置: 首页 > 知识库问答 >
问题:

为什么compareTo()有自己的实现体,而Comparable是一个接口?

丌官晨
2023-03-14

我知道在接口<代码>可比中有一个方法

并发现Comparable还返回一个值int,并且有自己的实现,而不需要在实现类中重写它。

例如,这个例子:

public static <T extends Comparable<T>> T max(T a, T b) {
    if (a == null) {
        if (b == null) return a;
        else return b;
    }
    if (b == null)
        return a;
    return **a.compareTo(b)** > 0 ? a : b;
}

共有3个答案

黄鸣
2023-03-14

它没有自己的实现。它只是像接口一样声明一个操作。在您的示例中,您在a上调用操作compareTo(),该操作类型为可比较的。这是可能的,因为可比较的声明了该操作。

但是,Comparable只是该变量的所谓静态类型。在运行时,它有一个动态类型。这意味着它指向的对象是Comparable(实现它)的子类型,因此也必须实现compareToa指向的对象不能直接是类型可比的,因为不能创建接口类型的对象。

在我看来,你应该仔细阅读面向对象、子类型和多态性。详细解释这一点对这个网站来说太过分了。

田翰林
2023-03-14

Comparable是一个接口,意味着实现它的对象必须实现它的方法。您是对的,因为它只有一种方法来实现compareTo(to)。关于返回整数的方法,您也是对的。compareTo返回负整数、零或正整数,因为此对象小于、等于或大于指定对象。

这样的接口存在的原因是为了使java更加通用。由于接口定义了一个标准的名称和比较的基础,这个标准可以用于其他方法,如Collections.sort或Collections.binary搜索。这样,如果你想对你刚刚在向量中创建的500个对象进行排序,你所要做的就是实现comareTo(T o),然后你可以调用Collections.sort(myVector)。

我想您可能会对一些对象已经实现了类似接口的事实感到困惑,比如Integer、String、UUID或CharBuffer。这些将“开箱即用”,但如果您尝试将JPanel向量(一个不实现可比性的类)传递给集合。排序,你会得到一个错误。

范云
2023-03-14

在您提供的方法中没有这样的“实现”——该方法只是comareTo的调用者。类型T扩展可比

例如,Integer实现了Comparable

Integer i = max(123, 42);

Stringimplementscompariable

String s = max("asdf", "blah");

这就是泛型方法的力量——它的主体可以在各种类型上重用。在这种情况下,该方法有一个可比较的上限

例如,这不会编译,因为对象没有实现可比性

// Object is the common supertype of Integer and String
Object o = max(42, "asdf");

 类似资料:
  • 我试图实现Comparable和compareTo(),但似乎无法实现。我一直在尝试不同的方法,但我真的不明白。我知道我应该实现可比较的接口,并且我需要在使用它之前创建方法(对我来说很奇怪,从python到面向对象编程)。 我希望它能比较两个人的年龄,所以我试着编写如下所示的代码,但似乎我不能使用compareTo()。我收到错误消息:“此方法必须返回int类型”,但在我看来,我只返回1、-1和0

  • 我面临一个java泛型的问题,我的计划是实现一个二叉查找树(key 中的if语句不被接受,我认为这是因为我重写了comareTo,但是我应该如何比较泛型? 还尝试了而不是,结果相同。 最好的问候 编辑:编译器说:在这一行的多个标记-比较类型中的方法comareTo(捕获#1-of?)不适用于参数(可比)-行断点: KeyValPair[line: 39]-comareTo(KeyValPair)

  • 问题内容: 有谁知道为什么 不执行?这意味着您无法对排序,这在我看来有点奇怪。 讨论后更新: 感谢所有有用的回复。最后,我对该主题进行了更多研究。 为什么java.lang.Number不实现Comparable的最简单解释源于可变性问题。 对于位的检讨,是抽象的超类型的,,,,,,,,和。在该列表中,并以没有实现。 深入研究,我发现在可变类型上实现不是一种好习惯,因为在比较期间或之后对象可能会更

  • 问题内容: 我想知道为什么Arrays类的sort方法要求一个Object []类型的参数。为什么参数不是Comparable []类型。如果不传递Comparable [],它将生成ClassCastException。 为什么… public static void sort(Object [] a) 而不是 public static void sort(Comparable [] a) ?

  • 问题内容: 我想要一个带有Real的compareTo方法(一个用于处理任意大而精确的实数的类[好吧,只要它现在的长度小于2 ^ 31])和一个带有一个对象,但是Java不允许我这样做,而且我还没有足够的经验来知道为什么。 我只是试图修改该类以实现Comparable,并且在下面得到了这些错误消息。我不是很明白错误消息的含义,但是我知道这与我试图为类制作的每个方法提供所有不同方法签名的灵活性的可怕

  • 问题内容: 我的意思是: 我用谷歌搜索,发现了这个: 表示定义接口方法的实现。但是接口没有实现,因此是不可能的。 但是,interface是100%抽象的类,抽象类可以实现接口(100%抽象的类)而无需实现其方法。将其定义为“接口”时会出现什么问题? 详细来说, 问题答案: 表示实现,当旨在声明仅提供不提供实现时。 A 100%,是功能上等同于,但它也可以实现,如果你想(在这种情况下,它不会保持1