scala泛型中的返回类型

时间:2018-06-05 15:51:16

标签: scala generics

我对scala很新,在某些情况下我很难使用通用语言。 我试着找一个简单的例子来说明我的问题

让我们先设置3个简单的地图

scala> val map1 = Map[String, String]("A" -> "toto", "B" -> "tutu")
map1: scala.collection.immutable.Map[String,String] = Map(A -> toto, B -> tutu)

scala> val map2 = Map[String, Int]("B" -> 2)
map2: scala.collection.immutable.Map[String,Int] = Map(B -> 2)

scala> val map3 = Map[String, String]("A" -> "foo")
map3: scala.collection.immutable.Map[String,String] = Map(A -> foo)

如果我使用++合并

scala> map1 ++ map2
res0: scala.collection.immutable.Map[String,Any] = Map(A -> toto, B -> 2)

我的地图变成了[String,Any],这就是我想要重现的东西

我在Map类中创建新方法

object MapUtils {
    implicit class utils[K, V](map: Map[K, V]) {
        def myUselessMethod(merge: Map[K, V]): Map[K, V] = {
            map ++ merge
        }
    }
}
import MapUtils._

scala> map1 myUselessMethod map3
res4: Map[String,String] = Map(A -> foo, B -> tutu)

scala> map1 myUselessMethod map2
<console>:18: error: type mismatch;
found   : scala.collection.immutable.Map[String,Int]
required: Map[String,String]
        map1 myUselessMethod map2

我应该如何定义我的方法,以便它可以返回[String,Any]

我还检查了scala MAP API,看看我是否可以有一些迹象 https://www.scala-lang.org/api/2.12.3/scala/collection/Map.html 但是

++[B >: (K, V), That](that: GenTraversableOnce[B])(implicit bf: 
CanBuildFrom[Map[K, V], B, That]): That

对我来说是难以理解的......

谢谢

1 个答案:

答案 0 :(得分:1)

只需在返回类型中给编译器一些松弛:

object MapUtils {
    implicit class utils[K, V](map: Map[K, V]) {
        def myUselessMethod[L >: V](merge: Map[K, L]): Map[K, L] = {
            map ++ merge
        }
    }
}
import MapUtils._

val map1 = Map[String, String]("A" -> "toto", "B" -> "tutu")
val map2 = Map[String, Int]("B" -> 2)

map1 myUselessMethod map2

现在它将推断L的最小上限Vmerge - 参数映射的值类型。如果是IntStringL将被推断为Any