从算法中学习(第四版)(作者:罗伯特·塞奇威克; Kevin韦恩),我试图重新创建他们的代码。他们使用了参数化构造函数(泛型),我认为这可能是因为2011年的Java代码与今天的Java代码不同。下面是一个例子:
private static boolean less(Comparable v, Comparable w) {
return (v.compareTo(w) < 0);
}
这在Java 11/18中有效。但问题是我的IDE将其突出显示为“参数化构造函数的原始使用”。根据我所读到的,我不应该这样做。
但似乎没有解决办法,我可以:保持方法静态,并使用泛型类型作为Comparable。
使类泛型化实际上并没有什么帮助,因为这样方法就不能使用类的泛型类型
错误消息:无法从静态上下文引用“SelectionSort.this”
但是给单个方法添加泛型也不起作用,因为我调用的其他方法不知道它们的类型和调用方法的类型是相同的。
public class SelectionSort {
public static <T> void sort (Comparable<T>[] array) {
for (int i = 0; i < array.length; i++) {
int min = i;
for (int j = i+1; j < array.length; j++) {
if (less(array[j],array[min]))
min = j;
}
exch(array, i, min);
}
}
private static <T extends Comparable<T>> boolean less(Comparable<T> v, Comparable<T> w) {
return (v.compareTo(w) < 0);
}
private static <T extends Comparable<T>> void exch(Comparable<T>[] a, int i, int j) {
Comparable<T> swap = a[i];
a[i] = a[j];
a[j] = swap;
}
}
错误消息:不存在类型变量T的示例,因此T符合Comparable
正如你所看到的,Java不知道两个T是相同的,我觉得这里有一个非常简单的解决方案,我只是没有得到。
1条答案
按热度按时间dxxyhpgq1#
Comparable.compareTo()
需要一个T
,而不仅仅是一个Comparable<T>
。为了调用它,第一个方法还需要一个
T
数组: