В чем разница между контравариантностью и наследованием в Java? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть родительский класс A и его дочерний класс B. В чем разница между этими двумя фрагментами:

    public static void main (String[] args) {
        ArrayList<? super A> e = new ArrayList<>();
        B thing = new B();
        e.add(thing);
        System.out.println(e.get(0));
    }
    public static void main (String[] args) {
        ArrayList<A> e = new ArrayList<>();
        B thing = new B();
        e.add(thing);
        System.out.println(e.get(0));
    }

1 Ответ

3 голосов
/ 18 октября 2019

Разница между ArrayList<? super A> и ArrayList<A> заключается в том, что первому можно присвоить объект ArrayList<T>, где T является суперклассом A или A.

Inконкретные термины, это допустимо:

ArrayList<? super A> listOfSuperA = new ArrayList<Object>();

Это не:

ArrayList<A> listOfA = new ArrayList<Object>();

Это означает, что вы можете получить значения различных типов из listOfA и listOfSuperA:

A a = listOfA.get(0); // valid
Object o = listOfA.get(0); // valid, because A can be converted to Object.
A a2 = listOfSuperA.get(0); // invalid, because listOfSuperA could contain Objects, which are not convertible to A
Object o2 = listOfSuperA.get(0); // valid, because whatever is in listOfSuperA, it can be converted to Object

Это может быть полезно, если вы хотите узнать больше о том, где использовать ? super T

...