【问题标题】:unchecked call to compare(T,T) as a member of the raw type Comparator作为原始类型 Comparator 的成员对 compare(T,T) 的未经检查的调用
【发布时间】:2017-06-13 20:56:54
【问题描述】:

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

我大致了解我需要以某种方式告诉我要传递给Comparator 的数据类型,但我使用的是泛型,所以我可以传递不同的数据类型,那么我该如何消除这个警告。

这是我看到此警告的代码的 sn-p:

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&lt;T&gt; 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--) {

【问题讨论】:

  • 不使用原始类型就可以避免很多问题。 (将类型参数添加到您的 Comparator。)

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


【解决方案1】:

据我所知,您必须更改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--)

【讨论】:

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-22
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    相关资源
    最近更新 更多