假设我使用隐式转换定义了以下类:
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()。有没有办法实现到具有相同命名方法的类的隐式转换?
您可以“强制”进行隐式转换,或者使其更加明确,如下所示:
implicit class ImplicitApplicator[A](a: A) {
def as[B](implicit conv: A => B): B = conv(a)
}
那么你可以这样做:
holder.as[Map[Long, String]].get(3)
否则,我认为没有办法解决名称冲突。这是隐式转换的基本限制之一。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句