java - 作为原始类型 Comparator 的成员对 Compare(T,T) 进行未经检查的调用

标签 java generics java-8 comparator raw-types

我们正在将现有代码从 Java 1.5 迁移到 Java 8,在使用 -Xlint 编译时,我遇到了诸如“未经检查地调用 compare(T,T) 作为原始类型 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> comparatorsetSort()方法,为什么我仍然收到以下错误?

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--) {

最佳答案

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

关于java - 作为原始类型 Comparator 的成员对 Compare(T,T) 进行未经检查的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44531422/

相关文章:

c# - (open generic type) 没有指定参数的 typeof 泛型类型

java-8 - 解析 LocalDateTime 格式

Java runtime.exec() 使用线程池运行多个进程

java - 类型安全的通用 Java 观察器编译时错误

java - 字符串中的双引号类似于 Python 中的三重双引号

java - 为什么 netty Promise 监听器签名 future 的返回类型是 <?超V>

java - 查找至少有 n 个元素与另一个键相同的键,包含列表

java - 在 Java 8 中迭代枚举

java - 关于 Callable 接口(interface)中的 call() 方法。在call()中调用其他静态方法时,是否会阻塞并影响性能?

java - Mongo数据库从 map 保存数据