下面给出一个 org.apache.commons.collections.map.MultiValueMap
的例子(来自commons-collections-3.2.1)
Map<String, Object> multiValueMap = MultiValueMap.decorate(new HashMap<String, Object>());
multiValueMap.put("orderId", 1L);
for(Map.Entry<String, Object> entry : multiValueMap.entrySet()) {
List<Object> value = (List<Object>) entry.getValue();
System.out.println(entry.getKey()+" : "+value.get(0));
}
这看起来很好 . 它显示一个键和与键关联的值 .
如果声明改变如下,
Map<String, Object> multiValueMap = MultiValueMap.decorate(new HashMap<String, Object>(){{
put("orderId", 1L);
}});
然后它抛出异常 -
java.lang.ClassCastException: java.lang.Long cannot be cast to java.util.List
在给定的唯一 foreach
循环的第一行 .
在这种情况下,给定的 MultiValueMap
实际上不是 MultiValueMap
. 这通常是 HashMap
.
如何通过这种方式更改声明有所作为?
3 回答
MultiValueMap是一个相当简单的 Map 装饰器 . 它会覆盖put方法并注入集合而不是实际值 . 在获取的情况下,它从底层 Map 获取集合 .
在你的第二个例子中,你正在装饰一个填充的 Map ,所以当MultiValueMap试图获取你的密钥的集合时,它会变长:
在上面的版本中,在变量multiValueMap上调用put(...) .
在这个版本中,put(...)在double的{{,即在HashMap上)之前的类的实例初始值设定项中被调用 .
因此,这两段代码并不相同 .