2017-07-29 58 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) 

否則,我不不要認爲名稱衝突有任何解決辦法。這是隱式轉換的基本限制之一。