Java: недопонимание дженериков и подстановочных знаков

Рассмотрим следующий код:

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 T> list объявление параметра List<? extends T> list равное List<? extends Comparable<? super T>> list List<? extends Comparable<? super T>> list List<? extends Comparable<? super T>> list ?

Всего 1 ответ


Есть очень небольшая разница.

List<? extends T> List<? extends T> означает

List объектов неизвестного типа, который является или T или subclsss T

List<? extends Comparable<? super T>> List<? extends Comparable<? super T>> значит

List объектов неизвестного типа, который либо Comparable<? super T> Comparable<? super T> или реализация Comparable<? super T> Comparable<? super T> .

Давайте рассмотрим эту иерархию классов: A и B являются несвязанными классами, которые оба реализуют Comparable<A> и оба являются окончательными. Да, я знаю, что эта ситуация надумана.

Если из возвращаемого значения T выводится как A , вы можете только передать List<A> параметру типа List<? extends T> List<? extends T> . Однако вы можете передать List<A> , а также List<B> параметру типа List<? extends Comparable<? super T>> List<? extends Comparable<? super T>> 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> , поэтому по большей части эти два типа совпадают.


Есть идеи?

10000