Scala:内隐分辨、歧义和逆变

Scala:内隐分辨、歧义和逆变,scala,contravariance,implicits,Scala,Contravariance,Implicits,我有下面一段带有模糊隐式的Scala,我认为应该可以,因为继承隐式的优先级较低。但它没有-它会失败,并出现不明确的隐式值-错误。有人能给我解释一下为什么优先级在这里不起作用吗 trait Printer[-T] { def prettify(instance:T): String } trait LowPriorityPrinter { implicit val anyPrinter:Printer[Any] = new Printer[Any]{ def prettify(insta

我有下面一段带有模糊隐式的Scala,我认为应该可以,因为继承隐式的优先级较低。但它没有-它会失败,并出现
不明确的隐式值
-错误。有人能给我解释一下为什么优先级在这里不起作用吗

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
捕获所有实例需要是泛型的,而不是任何
的:

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) }
}
基本上,literal
234
Any
一样是
Int
,并且这两种类型都不比另一种更具体(因此优先级技巧是无用的)