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;ipublic一个非通用的
compariable
“可以”与任何
对象进行比较(根据其
comparieto()
签名),但实际上,可能只有一小部分类型可以与之进行有意义的比较(给它其他类型将导致
comparieto()
抛出异常)。例如,您可以将
整数
强制转换为
可比
,但这仍然不允许您将其与
字符串
进行比较。因此,
可比[]
是一项风险业务,因为您不知道哪些元素比较安全,哪些不安全。通用版本更安全,因为
可比
通常与任何
T
可比,并且如果
T
被限制为
可比的实现者