I still don't *get* it however.
David Harrigan wrote:
public interface A {
public class B implements A {
public void doIt() {
Map<String, ? extends A> a = new HashMap<String, A>();
a.put("A Test", new B());
}
From Map<String, ? extends A> a, we know all the values of a extend A.
But there may be further constraints such that not all instances of A
can be values of a.
Suppose class C implements A. Then we could have had:
Map<String, C> map = new HashMap<String, C>();
Map<String, ? extends A> a = map;
a.put("A Test", new B()); // ILLEGAL
C c = map.get("A Test");
We have assigned a B to a C variable. Oops.
What you can write is:
Map<String, ? super A> a = new HashMap<String, A>();
With a declared as such, it could either be a Map<String,A> or
Map<String,Object>. So we can definitely add an instance of B
(implements A). However, when we get an object from the map, we only
know that it is some kind of Object.
Tom Hawtin