我正在将一个应用程序转换为使用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);
}
}
理想情况下,我希望该方法接受两个相同类型的可比性,是否可以转换以及如何转换?
我认为下面的方法可以解决这个问题:
protected static <T extends Comparable> int nullCompare(T o1, T o2) {
但它未能摆脱行中的警告“未检查调用'compareTo(T)‘作为原始类型’java.lang.Comparable‘的成员”行:
return o1.compareTo(o2);
发布于 2008-09-12 14:24:53
将其更改为:
protected static <T extends Comparable<T>> int nullCompare(T o1, T o2) {
你需要它,因为可比较本身就是一个泛型类型。
发布于 2008-09-22 15:30:53
我不确定泛化此方法是否有意义。目前,该方法适用于任何类型的可比较类型;如果泛化它,则必须多次实现它(使用完全相同的代码)。有时可以比较两个没有共同祖先的对象,而任何通用版本都不允许这样做。
通过添加泛型,您不会向代码添加任何安全性;任何安全性问题都将发生在对compareTo的调用中。我的建议是简单地抑制警告。它实际上并不是在警告你任何有用的东西。
发布于 2009-05-02 19:51:13
为了使它更通用,您甚至可以允许它为两种不同的类型工作。=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);
}
}
https://stackoverflow.com/questions/59107
复制相似问题