0

I have a parent class A, and its child class B. What is the difference between these two snippets :

    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));
    }
Zee
  • 824
  • 11
  • 25

1 Answers1

3

The difference between ArrayList<? super A> and ArrayList<A> is that the former can be assigned an object of ArrayList<T> where T is a superclass of A or A itself.

In concrete terms, this is valid:

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

This is not:

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

This means that you can get values of different types out of listOfA and 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

This might be useful if you want to learn more about where to use ? super T

Sweeper
  • 213,210
  • 22
  • 193
  • 313