java - Return type of generic Map.entrySet() -
map.entryset() declared as:
set<map.entry<k, v>> entryset(); somewhere define variable this:
map<? extends number, string> wildcardmap = new hashmap<>(); now, assume type param k ? extends number , this:
set<map.entry<? extends number, string>> entries = wildcardmap.entryset(); but gives compilation error, , have write:
set<? extends map.entry<? extends number, string>> entries = wildcardmap.entryset(); can explain why wildcard necessary right before map.entry?
the wildcard ? extends number means specific (unknown us) type extends number. let's try 1 possible type be, integer, , see happens:
map<integer, string> wildcardmap; // doesn't compile set<map.entry<? extends number, string>> entries = wildcardmap.entryset(); why? because wildcardmap.entryset() returns set<map.entry<integer, string>>, not subtype of set<map.entry<? extends number, string>>.
generics invariant , type arguments must match exactly, unless type argument wildcard. wildcard @ deeper level doesn't count (it's part of type). set<map.entry<integer, string>> not subtype of set<map.entry<? extends number, string>>, though map.entry<integer, string> subtype of map.entry<? extends number, string>, how list<string> not subtype of list<object> though string subtype of object.
Comments
Post a Comment