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)