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

暗黙の変換を解決できないため、最後の行でコンパイルが失敗します。私はこれは、クラスのホルダーにすでに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) 

そうでなければ、私は「ドン名前の矛盾を回避する方法はないと思う。暗黙の変換の基本的な制限の1つです。

関連する問題