【问题标题】:Java Object Map when passed to function and used as a String Map does not implicitly convert object to String [duplicate]传递给函数并用作字符串映射时,Java对象映射不会将对象隐式转换为字符串[重复]
【发布时间】: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


【解决方案1】:

回答您的问题。为什么将 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 返回类型。

【讨论】:

    【解决方案2】:

    尝试使用 Double.intValue(); https://www.tutorialspoint.com/java/lang/double_intvalue.htm

    int val= options.get(some_number).intValue();
    

    double 没有存储在 &lt;String,String&gt; Map 中,您会收到异常,因为 Integer.parseInt 需要一个 String 并且抛出 ClassCastException 的位置

    【讨论】:

      猜你喜欢
      • 2019-03-10
      • 1970-01-01
      • 2019-09-18
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      相关资源
      最近更新 更多