【发布时间】:2011-08-07 17:09:35
【问题描述】:
我今天遇到了一个我不太明白的怪事。以这段代码为例:
Object iMap = new HashMap<Integer, Object>() {{
put(5, "thing1");
put(6, "thing2");
}};
Map<String, Object> sMap = (Map<String, Object>)iMap;
// No error, prints out java.lang.Integer:
System.out.println(new ArrayList(sMap.keySet()).get(0).getClass().getName();
// No error, prints out 5:
Object key = new ArrayList<String>(sMap.keySet()).get(0);
System.out.println(key.toString());
// ClassCastException:
String s = new ArrayList<String>(sMap.keySet()).get(0);
那么,什么给了?为什么我可以将带有 Integer 类型键的 Map 转换为 String 类型之一而没有任何问题?那不应该抛出错误吗?为什么我什至可以转换为 ArrayList<String> 并且 仍然 没有错误?它应该是一个只有字符串的列表,但我可以从中检索一个整数。
对此我有点困惑,我想知道这里是否有人对这些类的内部工作有足够的了解来帮助我。
【问题讨论】:
-
代码的前四行无法编译。 iMap 至少需要声明为 Map。
-
@Hovercraft 不正确。自己试试这个代码。它编译。
-
@JakeKing:我在输入评论之前确实对此进行了测试。但没关系,因为这是一个基本的 Java 错误,而且它不应该编译。