未经检查的调用比较(T,T)作为原始类型Comparator的成员

时间:2017-06-13 20:56:55

标签: java generics java-8 comparator raw-types

我们正在将现有代码从Java 1.5迁移到Java 8,并且在使用-Xlint进行编译时,我遇到了警告,例如"未经检查的调用compare(T,T)作为原始类型{{1}的成员}}"

我粗略地了解我需要以某种方式告诉我将哪种数据类型传入Comparator,但是我使用泛型因此我可以传入不同的数据类型,所以我该如何消除这个警告。

这是我的代码片段,我看到了这个警告:

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 ); } 方法中说Comparator<T> comparator,为什么我仍然会收到以下错误?

setSort()

2 个答案:

答案 0 :(得分:2)

据我所知,您必须更改mergeSort的定义:

public static <T> void mergeSort(Object[] source, int[] src, int[] dest,
        int low, int high, int off, Comparator<T> c) {

而且你必须做一个演员:

 @SuppressWarnings("unchecked")
 T[] sourceC = (T[]) source;

您知道数组的类型为T,但您无法声明通用数组。但是没关系,因为T将在运行时以任何方式被删除到Object

并且for循环略有改变以使用:

for (int j = i; j > low && c.compare(sourceC[dest[j - 1]], sourceC[dest[j]]) > 0; j--)

答案 1 :(得分:0)

您收到的是一个警告:它只是告诉您,如果您传递错误的数据类型,您正在做的事情可能会给您带来问题。这并不意味着你无法编译和运行你的程序,但它告诉你,你有可能通过发送Comparator.compare()函数无法处理的东西来破坏你的程序。如果要真正删除此警告,请考虑查找传递的对象是否都继承了接口或父类,并将Comparator和对象数组参数化为该类型。