当前位置: 首页 > 面试题库 >

如何在Java中实现通用的max(Comparable a,Comparable b)函数?

杨凌
2023-03-14
问题内容

我正在尝试编写一个需要两个Comparables 的泛型max函数

到目前为止,我有

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 Comparable<?>可以解释为参数a的一种类型,而参数b的另一种类型,因此无法进行比较。

我如何从这个洞中挖出自己?


问题答案:

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

问题<T extends Comparable<?>>在于这表示类型T可与某种类型媲美,但您不知道该类型是什么。当然,根据常识,实现Comparable的类至少应该能够与自身进行比较(即,能够与自己类型的对象进行比较),但是从技术上讲,没有什么可以阻止A类实现Comparable<B>,其中A和B之间没有任何关系。<T extends Comparable<T>>解决了这个问题。

但这有一个微妙的问题。假设类X实现了Comparable<X>,并且我有一个扩展X的类Y。因此,类Y
Comparable<X>通过继承自动实现。Y类也无法实现,Comparable<Y>因为一个类无法使用不同的类型参数两次实现一个接口。这并不是真正的问题,因为Y的实例是X的实例,所以Y与Y的所有实例都可比。但是问题是您不能在<T extends Comparable<T>> T max(T a, T b)函数中使用类型Y
,因为Y没有实现Comparable<Y>。范围太严格了。<T extends Comparable<? super T>>解决了这个问题,因为T足以与T的某些超类型(包括所有T实例)进行比较。回想一下PECS规则-
生产者extends,消费者super-在这种情况下,Comparable是一个消费者(需要比较一个对象),因此super很有意义。


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



 类似资料:
  • 我最近发现了如何在Java中以某种迂回的方式模拟更高级的类型 这里,编码一种更高级的类型,该类型采用类型参数,其本身采用参数。 现在这让我想知道,我们可以用它来实现一些更高级的构造吗?例如,Haskell中Fix之类的函子的不动点及其对应的反态?

  • 从Udacity的深度学习类来看,y_i的软最大值只是指数除以整个Y向量的指数之和: 其中< code>S(y_i)是< code>y_i的softmax函数,而< code>e是指数,而< code>j是输入向量y中的列数 我尝试了以下方法: 返回: 但建议的解决方案是: 它产生与第一个实现相同的输出,即使第一个实现显式地取每列和max的差值,然后除以总和。 有人能用数学说明为什么吗?一个正确,

  • 我试图在java中实现crypto js中的以下代码以进行加密 以下是我的实现(AES/CBC/PKCS7Padding): GenerateIV(int, int, int, byte[], byte[], MessageDigest)的实现: 这个方法相当于OpenSSL的EVP_BytesToKey函数,正如我在cryptojs源代码(cryptojs)中看到的那样-js@4.1.1在文件密

  • 问题内容: 您好,这是我想要的,我连接到数据库并检索UniqueId列的最大元素,并将其分配给名为maxID的整数变量,这是我的方法: 解决这个问题的一种体面的方式,感觉是通过在while循环中使用“ rs2.next()”,这是一种非常粗糙的方式。 谢谢 问题答案:

  • 问题内容: 数组在Java中被实现为对象,对吗?如果是这样,我可以在哪里查看数组类的源代码。我想知道数组中的length变量是否定义为常量,如果是这样,为什么不是全部使用大写字母LENGTH来使代码更易于理解。 问题答案: 尽管从它们继承java.lang.Object的角度来看,数组是Object,但是这些类是作为语言的特殊功能动态创建的。它们未在源代码中定义。 考虑以下数组: 没有这样的源代码

  • 本文向大家介绍Python中max函数用法实例分析,包括了Python中max函数用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python中max函数用法。分享给大家供大家参考。具体如下: 这里max函数是Python内置的函数,不需要导入math模块 希望本文所述对大家的Python程序设计有所帮助。