This week's book giveaways are in the Refactoring and Agile forums.
We're giving away four copies each of Re-engineering Legacy Software and Docker in Action and have the authors on-line!
See this thread and this one for details.
Win a copy of Re-engineering Legacy Software this week in the Refactoring forum
or Docker in Action in the Cloud/Virtualization forum!
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

generics, Map.entrySet() and casting

 
ayco holleman
Greenhorn
Posts: 4
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I do not understand why the following code (and any plausible variation on it) refuses to compile

if (bean instanceof Map<?, ?>) {
Map<?,?> map = ((Map<?,?>) bean); // works
Set<Map.Entry<?, ?>> set = map.entrySet(); // error
// ...
}

Type mismatch: cannot convert from Set<Map.Entry<capture#4-of ?,capture#5-of ?>> to Set<Map.Entry<?,?>>


Only when I use the following sledge hammer (just short of doing completely away with generics), do I get the code to compile:

if (bean instanceof Map<?, ?>) {
Map<?,?> map = ((Map<?,?>) bean); // works
Set<?> set = map.entrySet(); // works
// ...
}

But then, of course, I cannot assume that my set consists of Map.Entry elements. I have tried variations using "<? extends Object" or simply "<Object", but it all refuses to compile.

So what syntax should I use to give my code a cool generic glow?

 
O Wright
Greenhorn
Posts: 3
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I know this is a late reply but I saw this looking for an answer as well.....



You can change

Set<Map.Entry<?, ?>> set = map.entrySet();

to

Set< ? extends Map.Entry<?,?>> set = map.entrySet();

and it will compile.

I'm not too impressed with java's generics because it seems that this can be assumed that the generic type can include the generic type's subtypes.
 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic