尺度:隐式解析、歧义和逆变
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
catch all instance of your type class 需要是通用的,而不是 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
既是 Int
又是 Any
,而且这两种类型都不比另一种更具体(因此优先技巧是没用)。
我有以下带有模糊隐式的 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
catch all instance of your type class 需要是通用的,而不是 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
既是 Int
又是 Any
,而且这两种类型都不比另一种更具体(因此优先技巧是没用)。