在下面的代码中,方法 isSorted
导致我的静态代码分析器向我发出警告:
未经检查地调用“compareTo(T)”作为原始类型“java.lang.comparable”的成员
现在,我从other posts找到解决方案是像等效函数 isSortedG
中那样泛化该函数。
但是,我不明白为什么第二种方法比第一种方法更好。据我所知,由于 isSorted
采用 Comparable[]
作为参数,这应该会导致对该函数的任何使用进行编译时检查,以确保输入数组确实是实现Comparable
的类型。
换句话说,静态检查器警告的“未经检查的调用”是什么?
public class SortChecker{
public boolean isSorted(Comparable[] arr){
if(arr.length == 1){
return true;
}
for(int i = 1; i < arr.length; ++i){
if(arr[i].compareTo(arr[i-1]) < 0){
return false;
}
}
return true;
}
public <T extends Comparable<? super T>> boolean isSortedG(T[] arr){
if(arr.length == 1){
return true;
}
for(int i = 1; i < arr.length; ++i){
if(arr[i].compareTo(arr[i-1]) < 0){
return false;
}
}
return true;
}
}
最佳答案
非泛型 Comparable
“可以”与任何 Object
进行比较(根据其 compareTo()
签名),但实际上,可能只有一小部分类型可以与其进行有意义的比较(并且为其提供其他类型将导致 compareTo()
抛出异常)。例如,您可以转换 Integer
到 Comparable
,但这仍然不允许您将其与 String
进行比较。因此,Comparable[]
这是一项有风险的业务,因为您不知道哪些元素可以安全比较,哪些元素不可以。通用版本更安全,因为 Comparable<T>
通常与任何 T
相当,如果 T
仅限于 Comparable<? super T>
的实现者, T[]
的所有元素应该是相互可比的。
关于Java:为什么使用泛型函数比采用接口(interface)类型作为函数参数更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33068412/