Re: Confusion using a parameterized collection with a sub class
"dugrocker" <doug.descombaz@gmail.com> wrote in message
news:1155839554.812463.209280@i3g2000cwc.googlegroups.com...
ArrayList<? extends A> bList; //The list should be a list of
something
//that either extends or
is an A. B
//Fullfills this
requirement
[...]
/* *********************************************************
* The problem is here in the next line.
*
* Compiler message:
*
* The method add(capture-of ? extends A) in the type
* ArrayList<capture-of ? extends A> is not applicable for the
* arguments (B)
*
* *********************************************************/
myContainer.bList.add(new B()); //(fails to compile)
First of all, realize that when a class extends another class, there is
an IS-A relationship formed between the two classes. That is, if B extends
A, then for any given instance of B, you can say that that instance IS-A A.
This more intuitive if you use real class names. Let's say Vehicule and Car.
Car extends Vehicule, and so you can say that a car IS-A Vehicule.
bList is an ArrayList<? extends Vehicule> which in informal terms means
it's a list of something which extends vehicule. Let's give that something a
name: call it S. Now you don't actually know what S is, only that S extends
Vehicule. So S could be Vehicule itself, or it could be Car, or it could be
some other class that extends Vehicule (such as Boat).
You can never add anything to this list. Why? Because there's no way to
guarantee that whatever it is your adding extends S. In the above example,
you're trying to add Car to the list, but it's not clear that the list can
accept Car, because Car might not extend S. (e.g. Car doesn't extend Boat,
so if S is actually Boat, you couldn't add the Car to a list of boats)
My guess is that you don't actually want an ArrayList<? extends
Vehicule>, but rather an ArrayList<Vehicule>. This is saying that you have a
list of vehicules. You can put a car in a list of vehicules, because a car
IS-A vehicule.
- Oliver