Re: Generics on map.
Mark Space wrote:
Eric Sosman wrote:
Ravi wrote:
Hi,
The following code compiles in eclipse 3.3.1. Shouldn't the compiler
throw an exception as the key doesn't pass instanceof check?
class Test {
public static void main(String args[]) {
Map<String,String> testmap = new HashMap<String, String>();
testmap.get(new StringBuffer());
}
}
No. The get() method of the Map interface takes any
Object reference as its argument, not a parameterized type.
Since testmap will only accept entries that have Strings as
keys, querying for a key of any other type will return null.
It's legal to ask, even when the answer will be "No."
Good one. Reading the OP's example, I assumed that get() took a
parameterized type as well, and I couldn't figure out why an exception
wouldn't be throw.
"When all else fails, read the documentation."
Or as in my case, "Learn from your blunders." I'd tried
to write a Map with case-insensitive Strings as keys:
Map<String,Thing> map = new HashMap<String,Thing>() {
public Thing put(String key, Thing value) {
return super.put(key.toLowerCase(), value);
}
public Thing get(String key) {
return super.get(key.toLowerCase());
}
}
.... and then I got splinters in my fingers from scratching
my head over why it didn't work. After the penny dropped,
I changed the second method to
public Thing get(Object key) {
if (key instanceof String)
key = ((String)key).toLowerCase();
return super.get(key);
}
.... and things worked a whole lot better. (The `if' isn't
necessary, but given my state of confusion at the time it's
perhaps forgivable.) Having been through this, I am now
"Once burned, twice shy."
--
Eric.Sosman@sun.com