首页 文章

斯卡拉型不匹配;找到Int,必填字符串

提问于
浏览
2

我在Scala中遇到类型不匹配的问题 . 编译器返回错误:

错误:类型不匹配; found:Int required:String val v3:Int =(v1 v2)

这是我的功能代码:

def sumMaps[T, Int](m1: Map[T, Int], m2: Map[T, Int]): Map[T, Int] = {
        val sameKeys = m1.keySet.intersect(m2.keySet)
        var m3: Map[T, Int] = m1 ++ m2
        for (key <- sameKeys) {
            val v1:Int = m1(key)
            val v2:Int = m2(key)
            val v3:Int = (v1+v2)
            //val v:Int = (m1(key) + m2(key))
            m3 = m3 updated (key, v3)
        }
    m3
}

为什么?知道可能是什么问题吗?

1 回答

  • 9

    当它是具体类型时,您将 Int 重新声明为类型参数 .

    您应该将方法头更改为:

    def sumMaps[T](m1: Map[T, Int], m2: Map[T, Int]): Map[T, Int] = {
    

    Int 是一个类型参数时,编译器将 (v1+v2) 替换为字符串添加,因此它变为 (v1.toString + v2.toString) ,这给您带来了问题 .

    UPDATE

    我想出了一个更简单的问题解决方案:

    def sumMaps[T](m1: Map[T, Int], m2: Map[T, Int]): Map[T, Int] = {
      (for (key <- m1.keySet ++ m2.keySet) yield {
        val v1: Int = m1.getOrElse(key, 0)
        val v2: Int = m2.getOrElse(key, 0)
        key -> (v1 + v2)
      }).toMap
    }
    

    或者更简单的一个:

    def sumMaps[T](m1: Map[T, Int], m2: Map[T, Int]): Map[T, Int] = {
      (m1 ++ m2).transform {
        case (key, _) => m1.getOrElse(key, 0) + m2.getOrElse(key, 0)
      }
    }
    

相关问题