Scala:隐含的解决方案,ambigiuty和逆变

时间:2017-08-21 19:14:38

标签: scala contravariance implicits

我有下面一段带有暧昧暗示的Scala,由于对继承的implicits的优先级较低,我认为应该可以使用。但它没有 - 它失败了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)

}

1 个答案:

答案 0 :(得分:2)

问题很简单,但令人讨厌。 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) }
}

基本上,文字234Int一样Any,而且这两种类型都不比另一种更具体(因此优先级技巧无用)