这两个 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);
您的一个方法定义允许调用,另一个不允许。
我是 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);
您的一个方法定义允许调用,另一个不允许。