例如,为了使用相同的函数迭代List< String>和List< List< String>>,我可以编写如下代码:
import java.util.*;
public class Test{
public static void print(Object obj) {
if(obj instanceof List){
List list=(List)obj;
System.out.print("[");
for(Object obj2 : list){
print(obj2);
}
System.out.print("]");
}else{
System.out.print(obj+",");
}
}
public static void main(String[] args){
String l0="a";
System.out.println(l0);
List<String> l1=Arrays.asList("a","b");
print(l1);
System.out.println("");
List<List<String> > l2=Arrays.asList(Arrays.asList("a","b"),Arrays.asList("c","d"));
print(l2);
}
}输出:
a
[a b ]
[[a b ][c d ]]现在我想迭代Map<字符串,String>和Map<字符串,Map<字符串,String>>,类似地,我尝试了:
import java.util.*;
public class Test{
public static void print(Object obj) {
if(obj instanceof Map){
System.out.print("{");
Map map=(Map)obj;
for(Map.Entry<Object,Object> entry : map.entrySet()){
print(entry.getKey());
System.out.print(":");
print(entry.getValue());
System.out.print(",");
}
System.out.print("}");
}else{
System.out.print(obj);
}
}
public static void main(String[] args){
String m0="a";
print(m0);
System.out.println("");
Map<String,String> m1=new HashMap<String,String>();
m1.put("surname","Tom");
m1.put("lastname","Bob");
print(m1);
System.out.println("");
Map<String,HashMap<String,String>> m2=new HashMap<String,HashMap<String,String>>();
HashMap<String,String> mm1=new HashMap<String,String>();
mm1.put("surname","Tom");
mm1.put("lastname","Bob");
mm1.put("nickname","Penguin");
m2.put("owner",mm1);
HashMap<String,String> mm2=new HashMap<String,String>();
mm2.put("name","Lucky");
mm2.put("type","cat");
m2.put("pet",mm2);
print(m2);
}
}其预期输出类似于:
a
{surname:Tom,lastname:Bob,}
{owner:{surname:Tom,nickname:Penguin,lastname:Bob,},pet:{name:Lucky,type:cat,},}但是它不能编译:
Test.java:20: error: incompatible types: Object cannot be converted to Entry<Object,Object>
for(Map.Entry<Object,Object> entry : map.entrySet()){原因何在?有没有可能修复它?如果没有,我如何递归地迭代嵌套的map,就像前面所示的递归迭代列表一样?
发布于 2017-07-31 17:09:53
Map与Map<Object,Object>不同。
它要么转换为Map<Object,Object>,要么使用不带泛型的Entry。
发布于 2017-07-31 17:24:52
这里:
public static void print(Object obj) {
if(obj instanceof Map){
System.out.print("{");
Map map=(Map)obj; // <-- raw map
....声明一个原始的Map。
它具有重要的后果,因为编译器将绑定已声明对象的方法,而不考虑泛型。
下面是在Map接口中声明的entrySet()方法:
Set<Map.Entry<K, V>> entrySet();这个方法看起来像这样:
Set entrySet();所以这段代码不能编译:
for (Map.Entry<Object, Object> entry : map.entrySet()) {因为你操纵了一个原始的Set。
要解决您的问题,您可以将Map转换为Map<Object,Object>或更好的Map<?, ?>:
Map<?, ?> map = (Map<?, ?>) obj;
for (Map.Entry<?, ?> entry : map.entrySet()) {
print(entry.getKey());
System.out.print(":");
print(entry.getValue());
System.out.print(",");
}https://stackoverflow.com/questions/45411631
复制相似问题