Java:为什么使用泛型函数比采用接口(interface)类型作为函数参数更好?

标签 java

在下面的代码中,方法 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() 抛出异常)。例如,您可以转换 IntegerComparable ,但这仍然不允许您将其与 String 进行比较。因此,Comparable[]这是一项有风险的业务,因为您不知道哪些元素可以安全比较,哪些元素不可以。通用版本更安全,因为 Comparable<T>通常与任何 T 相当,如果 T仅限于 Comparable<? super T> 的实现者, T[] 的所有元素应该是相互可比的。

关于Java:为什么使用泛型函数比采用接口(interface)类型作为函数参数更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33068412/

相关文章:

java - 拆分 java.util.stream.Stream

java - android - 回收适配器未出现在 View 寻呼机中

Java/HTML - 抛出 InvokingTargetException

java - 优化 SQLite 查询以使用一个查询

Java 不区分大小写的正则表达式匹配不适用于字母 Ñ

java - 解析YouTube链接

java - 如何在递归函数中存储数组?

java - 无法使用 JSON 和 JQuery 显示从 Spring MVC Controller 返回的响应

java - 将 UTF-8 PDF 字体获取到用 Java/Spring 编译的 JasperReports 3.7.* 报告中

java - 如何获取 helper.form 中单选组中项目的 ID?