题
我正在将应用程序转换为使用 Java 1.5,并找到了以下方法:
/**
* Compare two Comparables, treat nulls as -infinity.
* @param o1
* @param o2
* @return -1 if o1<o2, 0 if o1==o2, 1 if o1>o2
*/
protected static int nullCompare(Comparable o1, Comparable o2) {
if (o1 == null) {
if (o2 == null) {
return 0;
} else {
return -1;
}
} else if (o2 == null) {
return 1;
} else {
return o1.compareTo(o2);
}
}
理想情况下,我想让该方法采用两个相同类型的 Comparables,是否可以转换它以及如何转换?
我认为以下方法可以解决问题:
protected static <T extends Comparable> int nullCompare(T o1, T o2) {
但它未能消除 IntelliJ 中的警告“Unchecked call to 'compareTo(T)' as a member of raw type 'java.lang.Comparable'”:
return o1.compareTo(o2);
解决方案
将其更改为:
protected static <T extends Comparable<T>> int nullCompare(T o1, T o2) {
您需要它,因为 Comparable 本身就是一个泛型类型。
其他提示
这是一个奇怪的案例:
static class A {
...
}
static class B extends A implements Comparable<A> {
public int compareTo(A o) {
return ...;
}
}
幸运的是,像上面这样的代码很少见,但是 nullCompare() 不支持 B 的比较,除非声明 Comparable 可能适用于 T 或其任何超类:
protected static <T extends Comparable<? super T>> int nullCompare(T o1, T o2) {
尽管大多数人永远不会从上述调整中受益,但在为导出库设计 API 时它可能会派上用场。
无法编辑,所以我必须发布我的答案。
您需要声明嵌套类型参数,因为 Comparable 是通用的。
protected static <T extends Comparable<? super T>> int nullCompare(T o1, T o2) {
请注意 可比较<?超级T >, ,这使得更加灵活。您将在 Collections.sort 上看到相同的方法定义
public static <T extends Comparable<? super T>> void sort(List<T> list) {
我不确定通用化此方法是否有意义。目前该方法适用于任何类型的 Comparable;如果你将它通用化,你将不得不多次实现它(使用完全相同的代码)。有时可以比较没有共同祖先的两个对象,并且任何通用版本都不允许这样做。
通过添加泛型,您不会为代码添加任何安全性;任何安全问题都会在调用compareTo时发生。我建议只是抑制警告。它并没有真正警告您任何有用的信息。
为了使其更加通用,您甚至可以允许它适用于两种不同的类型。=P
/**
* Compare two Comparables, treat nulls as -infinity.
* @param o1
* @param o2
* @return -1 if o1<o2, 0 if o1==o2, 1 if o1>o2
*/
protected static <T> int nullCompare(Comparable<? super T> o1, T o2) {
if (o1 == null) {
if (o2 == null) {
return 0;
} else {
return -1;
}
} else if (o2 == null) {
return 1;
} else {
return o1.compareTo(o2);
}
}
不隶属于 StackOverflow