这两个 Java 通用方法是否接受相同的数据类型?

Do these two Java generic methods accept the same data types?

我是 Java 的新手,我正在尝试学习泛型。我尝试实现 binarySearch() 方法的简单版本,该方法也存在于 Collections class 中。我查了一下方法签名,它是这样的:

public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key) {
  // definition
}

我想知道如果您将方法定义更改为此,上述方法是否仍然接受相同的数据类型:

public static <T extends Comparable<? super T>> int binarySearch(List<T> list, T key) {
  // definition
}

如果不是,两者有什么区别?谢谢!

考虑这些 类:

class A extends Comparable<A> { /* ... */ }
class B extends A { /* ... */ }

现在用这些类型定义一个键和一个列表:

A key = new B();
List<B> list = List.of(key);

您可以使用这些参数调用第一种形式,但不能调用第二种形式。

例如:

static class NonComparable {

}

static class MyComparable implements Comparable<NonComparable> {
    @Override
    public int compareTo(NonComparable o) {
        return 0; // irrelevant for the example
    }
}

然后声明参数:

List<MyComparable> list = Arrays.asList(new MyComparable());
NonComparable  nonComparable = new NonComparable();
binarySearch(list, nonComparable);

您的一个方法定义允许调用,另一个不允许。