传递给函数并用作字符串映射的Java Object Map不会将对象隐式转换为String

时间:2019-04-26 07:22:17

标签: java collections hashmap

假设将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值存储在映射中


可以通过类型检查值或每次转换为字符串来轻松解决此问题。但我想了解为什么发生上述情况


2 个答案:

答案 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的地方