views:

284

answers:

4

If I have a method in MyClass such as

setSuperClassList(List<Superclass>)

...should I be able to do this:

new MyClass().setSuperClassList(new ArrayList<Subclass>())

It appears this won't compile. Why?

+1  A: 

It won't compile sincejava.util.List is not covariant.

Try setSuperClassList(List<? extends Superclass>) instead.

missingfaktor
+4  A: 

Try setSuperClassList(List<? extends Superclass>).

Also check PECS to see wether you should use ? extends or ? super.

Thomas Lötzer
+1 for mention of Pecs. :-)
Chris Jester-Young
agreed - thanks for the link
Drew Johnson
+4  A: 

You are just doing the generics a bit wrong. Add the ? extends bit, and that will allow the passed in list to contain the SuperClass or any of its subclasses.

setSuperClassList(List<? extends Superclass>)

This is called setting an upper bound on the generics.

The statement List<Superclass> says that the List can only contain SuperClass. This excludes any subclasses.

jjnguy
A: 

Do:

setSuperClassList(List<? extends Superclass> list)

This will allow a list of any subclass of Superclass.

Manuel Darveau