java - 在方法类型参数列表或方法参数中定义有界类型参数

标签 java generics

下面两个方法定义有什么区别?如果相同的话优先选择哪一个?

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 接受 类型变量Listsort2 接受类型变量的 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/

相关文章:

java - 如何从 header 获取最后修改日期到字符串

java - 使用 XSLT 为所有节点生成 XML 的 xpath

java - JSON查询过滤传输

java - 使用泛型和反射的单例工厂

java - 通过Collections类的算法获取集合的 “dynamically typesafe view”

ios - Swift 通用函数调用另一个通用函数

java - 为什么使用 readUTF 读取时出现 EOF 异常?

java - 无法将消息从 Json 字符串转换为对象。类转换异常

java - JPA - FindByExample

c# - 通用类型层次结构的流畅接口(interface)