scala将隐式函数添加到Map类中,失败为;结构细化可能不涉及摘要;

scala将隐式函数添加到Map类中,失败为;结构细化可能不涉及摘要;,scala,Scala,错误编译器消息: import scala.language.implicitConversions implicit def extendedMap[A,B](map: Map[A,B]) = new { def updatedOption(key: A, valueOption: Option[B]) = valueOption match { case Some(value) => map.updated(key, value) case N

错误编译器消息:

  import scala.language.implicitConversions

  implicit def extendedMap[A,B](map: Map[A,B]) = new {
    def updatedOption(key: A, valueOption: Option[B]) = valueOption match {
      case Some(value) => map.updated(key, value)
      case None => map - key
    }
  }

  var kv = Map.empty[String, String]
  kv.updatedOption("k1", Some("v1")

  //removing the implicit keyword, and explicitly calling the conversion also fails:
  extendedMap(kv).updatedOption("k1", Some("v1")

如何解决这个问题?

既然scala
2.10
你就不应该对
扩展方法使用
隐式def
——而是使用
隐式类。看见使用
隐式类
时,不应导入
语言。隐式转换

Parameter type in structural refinement may not refer to an abstract type defined outside that refinement
    def updatedOption(key: A, valueOption: Option[B]) = valueOption match {

                  ^
实际上,它应该使用
隐式def
和显式类声明,如下所示:

implicit class ExtendedMap[A,B](map: Map[A,B]) {
  def updatedOption(k: A, v: Option[B]) = v.map{ map.updated(k, _) }.getOrElse(map - k)
}

解决方法:
implicit类ExtendedMap[A,B](map:map[A,B]){def updatedOption(k:A,v:Option[B])=v.map{map.updated(k,)}.getOrElse(map-k)}
。使用隐式类代替隐式def很有效,谢谢。请将其作为答案再次发布,以便我可以将其标记为已接受。完成,但请注意这是一个解决方法。我不能告诉你为什么不能用抽象类型。
class ExtendedMap[A,B](map: Map[A,B]) {
  def updatedOption(k: A, v: Option[B]) = v.map{ map.updated(k, _) }.getOrElse(map - k)
}
implicit def toExtendedMap[A,B](map: Map[A,B]): ExtendedMap[A,B] =
  new ExtendedMap[A, B](map)