如何在Java中实现通用的“max(可比较的a,可比较的b)”函数?

2022-09-02 20:21:07

我正在尝试编写一个需要两个 s 的通用 max 函数。Comparable

到目前为止,我有

public static <T extends Comparable<?>> 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;
}

这无法编译

The method compareTo(capture#5-of ?) in the type Comparable<capture#5-of ?> is not applicable for the arguments (T)

我认为这是在说,in可以被解释为参数a的一种类型,参数b的另一种类型,因此无法比较它们。?Comparable<?>

我该如何把自己从这个洞里挖出来?


答案 1

为获得最佳效果,应使用 。public static <T extends Comparable<? super T>> T max(T a, T b)

问题在于,这说明类型 T 与某些类型相当,但你不知道该类型是什么。当然,常识会规定,实现Compolar的类应该至少能够与它自己进行比较(即能够与它自己类型的对象进行比较),但是从技术上讲,没有什么可以阻止类A实现,其中A和B彼此无关。 解决了这个问题。<T extends Comparable<?>>Comparable<B><T extends Comparable<T>>

但这有一个微妙的问题。假设类 X 实现 ,而我有一个扩展 X 的类 Y。因此,类 Y 通过继承自动实现。类 Y 也无法实现,因为一个类不能使用不同的类型参数实现接口两次。这并不是一个真正的问题,因为Y的实例是X的实例,所以Y可以与Y的所有实例相媲美。但问题是,您不能在函数中使用类型 Y,因为 Y 未实现 。界限太严格。 修复了这个问题,因为T足以与T的某种超类型(包括所有T实例)相媲美。回想一下规则PECS - 生产者,消费者 - 在这种情况下,是一个消费者(它接受一个对象进行比较),所以是有道理的。Comparable<X>Comparable<X>Comparable<Y><T extends Comparable<T>> T max(T a, T b)Comparable<Y><T extends Comparable<? super T>>extendssuperComparablesuper

这是 Java 库中的所有排序和排序函数使用的类型边界。


答案 2

你得到这个错误,因为基本上说它与没有任何细节的东西相当。您应该改为编写,以便编译器知道类型 T 与自身相当。Comparable<?>Comparable<T>


推荐