【问题标题】:Java: Why is using a Generified Function better than taking Interface Type as a Function Argument?Java:为什么使用生成函数比将接口类型作为函数参数更好?
【发布时间】:2015-10-11 18:12:04
【问题描述】:

在下面的代码中,isSorted 方法导致我的静态代码分析器给我一个警告说:

Unchecked call to 'compareTo(T)' as a member of raw type 'java.lang.comparable'

现在,我从other posts 发现解决方案是像在等效函数isSortedG 中所做的那样生成函数。

但是,我不明白为什么第二种方法比第一种更好。据我所知,由于isSortedComparable[] 作为参数,这应该导致对该函数的任何使用进行编译时检查,以确保输入数组确实是实现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;
    }
}

【问题讨论】:

    标签: java


    【解决方案1】:

    非泛型 Comparable“可以”与任何 Object 进行比较(根据其 compareTo() 签名),但实际上,可能只有一小部分类型可以进行有意义的比较(并且给它其他类型将导致compareTo() 抛出异常)。例如,您可以将Integer 转换为Comparable,但这仍然无法让您将其与String 进行比较。因此,Comparable[] 是有风险的业务,因为您不知道比较哪些元素是安全的,哪些不是。泛型版本更安全,因为Comparable&lt;T&gt; 通常与任何T 相当,如果T 被限制为Comparable&lt;? super T&gt; 的实现者,则T[] 的所有元素都应该相互比较。

    【讨论】:

      猜你喜欢
      • 2016-11-22
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 2022-07-03
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 2020-09-16
      相关资源
      最近更新 更多