Java:为什么使用泛型函数比将接口类型作为函数参数更好?
在下面的代码中,方法Java:为什么使用泛型函数比将接口类型作为函数参数更好?,java,Java,在下面的代码中,方法isSorted导致我的静态代码分析器向我发出警告: 作为原始类型“java.lang.Compariable”的成员对“compareTo(T)”的未选中调用 现在,我从中发现,解决方案是按照等效函数isSortedG中所做的那样泛化函数 但是,我不明白为什么第二种方法比第一种好。据我所知,由于isSorted将Comparable[]作为参数,因此应该对该函数的任何用法进行编译时检查,以确保输入数组确实是实现Comparable的类型 换句话说,静态检查器警告的“未检查调
isSorted
导致我的静态代码分析器向我发出警告:
作为原始类型“java.lang.Compariable”的成员对“compareTo(T)”的未选中调用
现在,我从中发现,解决方案是按照等效函数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;
}
}
公共类排序器{
公共布尔值已排序(可比[]arr){
如果(arr.length==1){
返回true;
}
对于(int i=1;i public一个非通用的compariable
“可以”与任何对象进行比较(根据其comparieto()
签名),但实际上,可能只有一小部分类型可以与之进行有意义的比较(给它其他类型将导致comparieto()
抛出异常)。例如,您可以将整数
强制转换为可比
,但这仍然不允许您将其与字符串
进行比较。因此,可比[]
是一项风险业务,因为您不知道哪些元素比较安全,哪些不安全。通用版本更安全,因为可比通常与任何T
可比,并且如果T
被限制为可比的实现者