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?
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?
It won't compile sincejava.util.List
is not covariant.
Try setSuperClassList(List<? extends Superclass>)
instead.
Try setSuperClassList(List<? extends Superclass>)
.
Also check PECS to see wether you should use ? extends
or ? super
.
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.
Do:
setSuperClassList(List<? extends Superclass> list)
This will allow a list of any subclass of Superclass.