Search code examples
javainheritanceparameterized

Java inheritance with parameterized Lists


I have a strange problem with inheritance and I don't understand why it should not work:

public interface A {  }

public interface B extends A {}


public class C {
void test() {
    ArrayList<A> foo = new ArrayList<B>();
    }
}

But compiling gives me the following error

Type mismatch: cannot convert from ArrayList<B> to ArrayList<A> C.java /bla/src/de/plai/test line 8 Java Problem


Solution

  • ArrayList<? extends A> foo = new ArrayList<B>();
    

    A List of A is not the same that a List of B because you could not guarantee consistency of contents in the list.

    Namely, if it were possible you could insert an item of type A in a list that was instantiated only to contain B elements.

    Of course the above declaration will prevent you from writing any elements into the list. This is a read-only declaration.

    Also it is a good OOP principle to declare the variables as interfaces, not implementations:

    List<? extends A> foo = new ArrayList<B>();