java - 带有通用参数的比较会发出警告

标签 java generics comparison

我想比较 less 方法中两个 Comparable 类型的参数。但如果我使用 comapreTo 它会给我类型转换错误:

private boolean less(Comparable<T> u, Comparable<T> v) {
    return u.compareTo(v) < 0;
}

我通过将传递给compareTo的参数进行类型转换来解决这个问题。但它仍然给我警告(类型安全:从 Comparable 到 T 的未经检查的转换)。为什么会这样呢。难道我做错了什么。实现这一目标的最佳方法是什么。

private boolean less(Comparable<T> u, Comparable<T> v) {
    return u.compareTo((T) v) < 0;
}

最佳答案

u类型为Comparable<T> , u.compareTo()需要 T 。你正在通过它v ,一个Comparable<T> ,不兼容。

您可能会假设有一个实现 Comparable 的类型与本身是可比的。但技术层面上并没有这样的要求。对我来说,创建一个类型是完全合法的 Foo ,即Comparable<Bar> ,即它与 Bar 进行比较,其中FooBar完全不相关。试图通过 Foo进入Foo对象的compareTo会崩溃。

如果你想限制两个参数的类型相同,并且可以与自身进行比较,你可以这样做

private <T extends Comparable<? super T>> boolean less(T u, T v) {
    return u.compareTo(v) < 0;
}

但是,出于此函数的目的,两个参数具有相同类型的约束在技术上并不是必需的(尽管在所有正常用例中都应该如此)。在泛型中,我们总是希望使用尽可能少的限制,即,正如其他答案所提到的,

private <T> boolean less(Comparable<T> u, T v) {
    return u.compareTo(v) < 0;
}

在您的评论中,您提到您正在比较 Comparable<T>[] 中的元素。这不是一种允许您比较元素的数组类型。你只知道它是一个与某个 T 相当的元素数组。 ,但无法与自己相比。更有用的是 T[] ,其中T有一个与自身可比较的界限:

class Whatever<T extends Comparable<? super T>> {
    //...
    T[] yourArray;
}

关于java - 带有通用参数的比较会发出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34035918/

相关文章:

java - 等待 Completable future 线程完成的推荐方法是什么

java - 在Gradle中运行测试的子集

generics - 编写一个通用的 Scala 转换函数

swift - 使用需要泛型的方法扩展 Swift 类型

java - 集合排序(空列表()): cannot infer type-variable

java - 如何在java中将时间字符串与当前时间进行比较?

python嵌套字典比较

java - sh : java: permission denied tryinng to execute . jar文件

java - 线程 "main"java.lang.ArrayIndexOutOfBoundsException : 13 中的异常

python - 仅当单独的 boolean 列表中的元素为真时,才对 python 列表中的元素求和