首页 > 解决方案 > 传递给函数并用作字符串映射时,Java 对象映射不会将对象隐式转换为字符串

问题描述

假设一个 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 中,Double(6.0) 值与 String ("Size") 键一起存储,这导致 ClassCastException 为:

java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.String

在我的 getFromMap() 函数中。


帮助我理解为什么在调用函数并将 Map 作为参数传递时没有引发错误,或者为什么没有将值转换为字符串。

为什么 Double 值存储在 <String,String> 映射中


这个问题可以很容易地通过类型检查值或每次转换为字符串来解决。但我想了解为什么会发生上述情况


标签: javacollectionshashmap

解决方案


回答您的问题。为什么 Double 值存储在 Map 中

您已经创建了 Map,因此您可以将任何数据类型对象放入此映射中,当您仅放入 6.0 时,它的行为将是两倍,您将其设置为“6.0”,其类类型为 String,如 demo

            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 返回类型。


推荐阅读