Drew Johnson
Drew Johnson

Reputation: 19223

Java Generics: set List of superclass using List of subclass

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?

Upvotes: 9

Views: 13163

Answers (4)

Manuel Darveau
Manuel Darveau

Reputation: 4635

Do:

setSuperClassList(List<? extends Superclass> list)

This will allow a list of any subclass of Superclass.

Upvotes: 0

jjnguy
jjnguy

Reputation: 138982

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.

Upvotes: 6

Thomas L&#246;tzer
Thomas L&#246;tzer

Reputation: 25411

Try setSuperClassList(List<? extends Superclass>).

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

Upvotes: 23

missingfaktor
missingfaktor

Reputation: 92126

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

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

Upvotes: 1

Related Questions