我对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
对我来说是难以理解的......
谢谢
答案 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
的最小上限V
和merge
- 参数映射的值类型。如果是Int
和String
,L
将被推断为Any
。