下面两个方法定义有什么区别?如果相同的话优先选择哪一个?
public static <T extends Comparable<? super T>>
void sort1(List<T> list) {}
public static <T>
void sort2(List<? extends Comparable<? super T>> list) {}
如果方法有多个使用类型参数的参数,那么有什么区别?
public static <T extends Comparable<? super T>>
void add1(List<T> list, T element) {}
public static <T>
void add2(List<? extends Comparable<? super T>> list, T element) {}
最佳答案
这些并不相同;对于类型系统,它们是不同的。 sort1
接受 类型变量 的 List
,sort2
接受类型变量的 List
通配符。由于您正在执行排序操作,因此将修改传入参数(List
);您可能想在内部执行此操作,例如:
public static <T extends Comparable<? super T>> void sort1(List<T> list) {
list.set(0, list.get(0));
}
public static <T> void sort2(List<? extends Comparable<? super T>> list) {
list.set(0, list.get(0)); // does not compile
}
只是发现第二个无法编译,因为它使用通配符
(不过有一些方法可以解决这个问题)。
如果您尝试这样做,第二个示例中也会出现完全相同的情况:
public static <T> void add2(List<? extends Comparable<? super T>> list, T element) {
list.add(element);
}
一般规则是,当您尝试修改时,您希望坚持使用类型变量。如果您无法做到这一点,可以通过多种方法来解决它,例如通配符捕获
。
关于java - 在方法类型参数列表或方法参数中定义有界类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62654574/