假设将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;
}
现在,根据我的理解,应该发生2件事中的1件事:
java编译器都应该引发错误,因为映射定义不同,所以找不到具有相同签名的此类方法 映射中定义的所有键和值应已隐式转换为String 但是以上均未发生,因此在我的地图中,Double(6.0)值是使用String(“ Size”)键存储的,这导致ClassCastException为:
java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.String
在我的getFromMap()函数中。
帮助我理解为什么在调用函数并将Map作为参数传递时没有抛出错误,或者为什么未将值转换为String。
为什么Double值存储在
可以通过类型检查值或每次转换为字符串来轻松解决此问题。但我想了解为什么发生上述情况
答案 0 :(得分:0)
回答您的问题。为什么Double值存储在Map中
您已创建地图 因此,当您仅放置6.0时,您可以在该映射中放置任何数据类型对象,它的行为将是它放置为“ 6.0”时的两倍,其类类型为String 像演示
Object obj="6.0";
System.out.println("type is ="+obj.getClass());
obj=6.0;
System.out.println("type is ="+obj.getClass());
obj=6;
System.out.println("type is ="+obj.getClass());
输出:
type is =class java.lang.String
type is =class java.lang.Double
type is =class java.lang.Integer
最好使用Object返回类型。
答案 1 :(得分:-2)
尝试使用Double.intValue(); https://www.tutorialspoint.com/java/lang/double_intvalue.htm
int val= options.get(some_number).intValue();
存储在<String,String> Map
中的double wasnt,您会得到Exception,因为Integer.parseInt需要一个String以及抛出ClassCastException的地方