【发布时间】:2019-04-26 07:22:16
【问题描述】:
假设一个HashMap定义为:
void defineMap(){
Map options = new HashMap<Object,Object>();
options.put("isValid","true");
options.put("isXYZ","false");
options.put("Size",6.0);
int x = getFromMap(options);
}
现在,当这个映射被传递给一个函数并且在函数的签名中,映射被定义为
static int getFromMap(Map<String, String> options) {
String some_number = "Size";
int val=Integer.parseInt(options.get(some_number));
return val;
}
现在,根据我的理解,两件事情中的一件应该发生了:
java 编译器应该抛出一个错误,因为映射定义不同,所以找不到具有相同签名的此类方法 Map 中定义的所有键和值都应该已隐式转换为 String 但是以上都没有发生,因为在我的 Map 中,Double(6.0) 值与 String ("Size") 键一起存储,这导致 ClassCastException 为:
java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.String
在我的 getFromMap() 函数中。
帮助我理解为什么在调用函数并将 Map 作为参数传递时没有引发错误,或者为什么没有将值转换为字符串。
为什么将 Double 值存储在
这个问题可以通过每次对值进行类型检查或转换为字符串来轻松解决。但我想了解为什么会出现上述情况
【问题讨论】:
-
当您使用类型 Map 时发出原始类型警告 ,但未指定其泛型类型。将其定义为 Map
,您将无法在其中插入除 String 之外的任何内容。 -
泛型不是将对象转换为其他类型。那永远不会发生。这是关于指定允许的类型。
-
Map options- 您使用的是原始类型。如果您忽略编译器警告,您就不能抱怨您没有收到警告!
标签: java collections hashmap