2017-07-29 59 views
0

说我定义与隐式转换下列类方法的类:如何做隐式转换到具有相同的名称

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()。有没有一种方法可以实现隐式转换为具有相同命名方法的类?

回答

0

你可以“力”的隐式转换,或使它有点更明确,像这样的东西:

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

然后,你可以这样做:

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

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