未经检查的调用 compare(T,T) 作为原始类型 Comparator 的成员
unchecked call to compare(T,T) as a member of the raw type Comparator
我们正在将现有代码从 Java 1.5 迁移到 Java 8,在使用 -Xlint 进行编译时,我遇到了类似 "unchecked call to compare(T,T)
as a member of the raw type 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 );
}
因为我已经在 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--) {
您得到的是一个警告:它只是告诉您,如果您向它传递错误的数据类型,您正在做的事情可能会给您带来问题。这并不意味着您不能编译和 运行 您的程序,而是告诉您发送 Comparator.compare() 函数无法处理的内容会使您的程序有崩溃的危险。如果您想真正删除此警告,请考虑查找您传递的对象是否都继承了接口或父对象 class 并将比较器和对象数组参数化为该类型。
据我所知,您必须更改 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 1.5 迁移到 Java 8,在使用 -Xlint 进行编译时,我遇到了类似 "unchecked call to compare(T,T)
as a member of the raw type 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 );
}
因为我已经在 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--) {
您得到的是一个警告:它只是告诉您,如果您向它传递错误的数据类型,您正在做的事情可能会给您带来问题。这并不意味着您不能编译和 运行 您的程序,而是告诉您发送 Comparator.compare() 函数无法处理的内容会使您的程序有崩溃的危险。如果您想真正删除此警告,请考虑查找您传递的对象是否都继承了接口或父对象 class 并将比较器和对象数组参数化为该类型。
据我所知,您必须更改 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--)