我想比较 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
进行比较,其中Foo
和Bar
完全不相关。试图通过 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/