1

我知道 Interface 中有一种方法Comparable<T>,即compareTo(). 我假设它只是一个没有任何实现的函数名,当任何类实现 Comparable 接口时,该类必须覆盖该方法。但后来我读了文档

并发现 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;
}
4

3 回答 3

4

您提供的方法中没有这样的“实现”-该方法只是. compareTo类型是指实现的T extends Comparable<T>一些变量类型。TComparable<T>

例如,Integerimplements Comparable<Integer>,所以你可以调用:

Integer i = max(123, 42);

Stringimplements Comparable<String>,所以你也可以调用:

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

这就是泛型方法的强大之处——它的主体可以在各种类型上重用。在这种情况下,该方法的类型变量有一个上限,以保证它可以调用的实例。Comparable<T>TcompareToT

例如,这不会编译,因为Object没有实现Comparable<Object>

// Object is the common supertype of Integer and String
Object o = max(42, "asdf");
于 2013-07-22T14:38:51.700 回答
1

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

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

我认为您对某些对象已经实现接口 Comparable(例如 Integer、String、UUID 或 CharBuffer)这一事实感到困惑。这些将“开箱即用”,但是如果您尝试将 JPanels 的 Vector(一个不实现 Comparable 的类)传递给 Collections.sort,您将收到错误消息。

于 2013-07-22T14:42:15.617 回答
0

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

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

在我看来,您应该阅读面向对象、子类型和多态性的内容。详细解释它对于这个网站来说太过分了。

于 2013-07-22T14:39:09.193 回答