有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java unchecked调用将(T,T)作为原始类型比较器的成员进行比较

我们正在将现有代码从Java 1.5迁移到Java 8,在使用-Xlint编译时,我遇到了一些警告,比如“作为原始类型Comparator的成员对compare(T,T)进行未经检查的调用”

我大致理解,我需要以某种方式告诉我将要传递给Comparator的数据类型,但我使用泛型,这样我就可以传递不同的数据类型,所以如何消除这个警告

下面是我的代码片段,我看到了以下警告:

private static void  mergeSort(Object[] source, int[] src,int[] dest,
                                        int low, int high, int off,  Comparator c) {
        int length = high - low;

        for (int i=low; i<high; i++)
                for (int j=i; j>low && c.compare(source[dest[j-1]], source[dest[j]])>0; j--) {
                    int t =  dest[j];
                    dest[j] = dest[j-1];
                    dest[j-1] = t;
                }
            return;
}

这被称为:

public void setSort( Comparator<T> comparator) {
List<T> currentList = getCurrentList();

        int[] dst = new int[currentList.size()];
        for (int i=0; i< currentList.size(); i++)
            dst[i]=i;
        int [] src = dst.clone();
        mergeSort (currentList.toArray(), src, dst,0, dst.length, 0,  comparator );
}

既然我已经在setSort()方法中说了Comparator<T> comparator,为什么我仍然得到下面的错误

warning: [unchecked] unchecked call to compare(T,T) as a member of the
raw type Comparator  [multiant]               for (int j=i; j>low &&
c.compare(source[dest[j-1]], source[dest[j]])>0; j--) {

共 (1) 个答案

  1. # 1 楼答案

    你得到的是一个警告:它只是告诉你,如果你传递错误的数据类型,你正在做的事情可能会给你带来问题。这并不意味着你不能编译和运行你的程序,但它告诉你,如果你向比较器发送某个数据,你的程序就有崩溃的危险。compare()函数无法处理。如果您想真正删除此警告,请考虑查找您传递的对象是否都继承了接口或父类,并将比较器和对象数组参数化为该类型。p>