这是我尝试实现二分查找的代码:
static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)
static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
然而,我希望避免代码重复,并将其中一个实现委托给另一个实现(目前是将第一个实现委托给第二个实现)。为了做到这一点,我需要摆脱通配符?
并使用第二个泛型类型,如下所示:
public class BinarySearch {
public static <Q extends Comparable<? super T>, T>
int search(List<Q> xs, T x) {
return search(xs, x, Q::compareTo);
}
public static <T>
int search(List<? extends T> xs, T x, Comparator<? super T> cmp) {
int l = 0, r = xs.size() - 1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (cmp.compare(xs.get(mid), x) == 0)
return mid;
if (cmp.compare(xs.get(mid), x) < 0)
r = mid - 1;
else
l = mid + 1;
}
return xs.size();
}
}
不幸的是,这段代码无法编译,出现了以下错误:
静态上下文中无法引用非静态方法
我该如何解决?
PS:如果你想知道为什么Collections
的签名看起来像这样,这里有一个解释:这两个泛型签名的Collections.binarySearch有何不同?
PPS:曾经有一个(现已删除的)答案,声称你不能将T::compareTo
传递到需要Comparator
的位置。嗯,我相信你可以,在这里是我实际工作中的QuickSort实现:https://github.com/all3fox/algos-java/blob/481f2c71952bf2c7510cb93cc1af8e90016ccf3b/src/main/java/io/github/all3fox/sort/QuickSort.java
return
语句。 - Codo