如何隐式转换为具有相同名称的方法的类

时间:2017-07-29 15:00:12

标签: scala

假设我使用隐式转换定义了以下类:

abstract class Holder[K, V] {
    var map = Map[K, V]()
    def key(v: V): K
    def get(v: V) = map.get(key(v))
}

implicit def toMap[K, V](holder: Holder[K, V]): Map[K, V] = holder.map

我试着这样使用它:

val holder = new Holder[Long, String] {
    def key(str: String) = str.toLong
}

holder.get("3")
toMap(holder).get(3)
holder.get(3)

编译将在最后一行失败,因为无法解析隐式转换。我猜这是因为类Holder已经包含方法get()。有没有办法可以实现隐式转换为具有相同命名方法的类?

1 个答案:

答案 0 :(得分:0)

你可以“强制”一个隐式转换,或者使它更明确一些,如下所示:

implicit class ImplicitApplicator[A](a: A) {
  def as[B](implicit conv: A => B): B = conv(a)
}

然后你可以这样做:

holder.as[Map[Long, String]].get(3)

否则,我认为没有办法解决名称冲突。这是隐式转换的基本限制之一。