【问题标题】:Scala map casting issues: type mistmatchScala映射转换问题:类型不匹配
【发布时间】:2017-01-09 14:39:28
【问题描述】:

我有以下 Scala 函数:

def processMaps(toProcess : Map[Object,Object]) : Unit = {
  // The 'toProcess' map might have a key named 'innerMap' which is itself a Map[String,String]
  // Compiler Error: type mismatch; found : Object required: (String, String)
  val innerMap : Map[String,String] = if (toProcess.containsKey("innerMap")) Map(toProcess.get("innerMap")) else null

  // Do stuff to 'innerMap'...
}

问题在于innerMap 声明产生以下编译器错误:

类型不匹配;找到:需要对象:(字符串,字符串)

知道为什么以及修复是什么吗?

【问题讨论】:

    标签: scala compiler-errors type-mismatch


    【解决方案1】:

    toProcess.get("innerMap") 返回一个对象,而您正试图从一个对象创建一个 Map[String,String],这是没有意义的

    你可以(但你不应该,因为它会在运行时抛出异常)强制类型转换:

    toProcess.get("innerMap").asInstanceOf[Map[String, String]]
    

    您的代码中有几个细节不是最好的:

    1. Map[Object,Object] ?您应该使键和值更具体。为什么你有这样一个通用类型?你在混合非常不同的类型吗?这不是惯用的 Scala。至少有一个 Map[String, Map]
    2. 如果是 Scala Map(而不是 Java Map),Map.get 方法将返回 Option。您可以使用.getOrElse(defaultValue),或者代替Map.get 使用Map.getOrElse(key, defaultValue)
    3. Scala 避免使用nulls。相反,它使用Option 来封装可能不存在的值,然后使用.map 等典型(monad)函数在值存在时应用某些函数/行为

    【讨论】:

      【解决方案2】:

      这是另一种可能的解决方案。模式匹配是你的朋友,避免了感觉有点脆弱的 asInstanceOf。

      def processMaps(toProcess : Map[Object,Object]) : Unit = {
          val maybeObject: Option[Object] = toProcess.get("innerMap")
          maybeObject.foreach {
            case inner: Map[String, String] => // do some stuff to inner
              Unit
            case _ => // do nothing
              Unit
          }
      }
      

      甚至更少的代码

      def processMaps(toProcess : Map[Object,Object]) : Unit = {
          toProcess.get("innerMap").foreach {
             case inner: Map[String, String] => // do some stuff to inner
             case _ => // do nothing
          }
      }
      

      这里有几件事。

      1. 使用模式匹配更不容易出错
      2. 对于返回 Unit 的代码,首选 foreach。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-23
        • 2016-05-10
        • 1970-01-01
        • 2012-02-07
        • 1970-01-01
        • 1970-01-01
        • 2012-08-27
        • 2013-05-30
        相关资源
        最近更新 更多