T max(Collection c) 和 public static > T max(Collection c) 我想不出这两者不能互换-6ren">
gpt4 book ai didi

java - 集合的 "max"函数的这两个通用签名之间是否有区别

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:43 25 4
gpt4 key购买 nike

这两个签名之间有实际区别吗:

public static <T extends Comparable<? super T>> T max(Collection<T> c) 

public static <T extends Comparable<T>> T max(Collection<? extends T> c) 

我想不出这两者不能互换的单个用例。

那么两者兼而有之的原因是什么? super T 和?在 Java 集合中的标准 max() 方法中扩展 T:

public static <T extends Comparable<? super T>> T max(Collection<? extends T> coll)

编辑:这个问题不是关于<? super T>之间的区别和 <? extends T> . get/put 原则对我来说很清楚。问题是关于这两个特定签名之间的区别以及为什么 Java Collections API 的创建者决定为他们的标准“最大”函数创建这两个签名的混合。

最佳答案

两者不可互换的例子是:

static class A implements Comparable<Object> {
@Override
public int compareTo(final Object o) {
return 0;
}
}

包含 A 实例的列表适用于第一个 max() 而不适用于第二个 max():

error: method max2 in class Generics cannot be applied to given types;
max2(Arrays.asList(new A()));
^
required: Collection<? extends T>
found: List<A>
reason: inference variable T has incompatible bounds
equality constraints: Object
upper bounds: Comparable<T>
where T is a type-variable:
T extends Comparable<T> declared in method <T>max2(Collection<? extends T>)

另一个例子:

static class A {}
static class B extends A implements Comparable<A>{
@Override
public int compareTo(final A o) {
return 0;
}
}

max() 以这种方式设计,以确保其签名未更改,并且所有编译代码都依赖于 max()(Java 5 之前的代码)返回一个 Object 仍然有效,更多细节在 Converting Legacy Code to Use Generics 中.

关于java - 集合的 "max"函数的这两个通用签名之间是否有区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43000818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com