Java:误解泛型和通配符

Java: misunderstanding generics and wildcards

考虑以下代码:

public final class Algorithm {
    public static <T extends Comparable<? super T>>
        T max(List<? extends T> list, int begin, int end)
    {
            // ...
    }
}

List<? extends T> list参数声明是否等于List<? extends Comparable<? super T>> list

略有不同。

List<? extends T>表示

a List of objects of an unknown type that is either T or a subclsss of T

List<? extends Comparable<? super T>>表示

a List of objects of an unknown type that is either Comparable<? super T> or an implementation of Comparable<? super T>.

让我们考虑这个 class 层次结构:AB 是不相关的 class,它们都实现 Comparable<A> 并且都是最终的。是的,我知道这种情况是人为的。

如果从return值推断TA,则只能将List<A>传递给[=11=类型的参数].但是,您可以将 List<A>List<B> 传递给 List<? extends Comparable<? super T>>.

类型的参数

这里有一个例子可以证明我的观点:

public static void main(String[] args) {
    List<A> aList = Collections.singletonList(new A());
    List<B> bList = Collections.singletonList(new B());
    A a = f(aList);
    A b = f(bList); // doesn't compile
    A c = g(bList);
    A d = g(bList);
}

public static <T extends Comparable<? super T>> T f(List<? extends T> list) {
    return null;
}

public static <T extends Comparable<? super T>> T g(List<? extends Comparable<? super T>> list) {
    return null;
}

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

虽然在现实中,很少有像class B implements Comparable<A>这样的事情发生,所以大部分,这两种类型问题是一样的。