[英]Scala: Implicit resolution, ambigiuty and contravariance
我有以下具有模糊隐式的Scala,由于对继承的隐式的优先级较低,因此我认为它应该可以工作。 但是,它并不会-会因ambiguous implicit values
错误而失败-错误。 有人可以向我解释为什么优先事项在这里不起作用吗?
trait Printer[-T] {
def prettify(instance:T): String
}
trait LowPriorityPrinter {
implicit val anyPrinter:Printer[Any] = new Printer[Any]{ def prettify(instance:Any) = instance.toString() }
}
object Printer extends LowPriorityPrinter {
implicit val intPrinter = new Printer[Int]{ def prettify(instance:Int) = instance.toString() }
}
object MyApp extends App {
def prettyprint[T](i:T)(implicit p:Printer[T]) = println(p.prettify(i))
prettyprint(234)
}
问题很简单,但很讨厌。 LowPriorityPrinter
捕获类型类的所有实例都是通用的,而不是对于Any
:
object Printer {
implicit val intPrinter: Printer[Int] =
new Printer[T]{ def prettify(x: T) = x.toString() + " (int") }
implicit def anyPrinter[T]: Printer[T] =
new Printer[T]{ def prettify(x: T) = x.toString() + " (general) }
}
基本上,字面量234
和Any
一样,都是一个Int
,并且这两个类型都不比另一个更具体(因此优先级技巧没有用)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.