在Scala中,是否可以使用implicits自动覆盖toString?

del*_*ber 8 scala

在Java中,我会做类似的事情

class MyDate extends java.util.Date {
  public String toString() { ... }
}

MyDate date = new MyDate
Run Code Online (Sandbox Code Playgroud)

有点笨重.在Scala中,是否可以覆盖toString,同时仍然使用常规的java.util.Date而不是MyDate.我有一个暗示涉及但很乐意使用任何技术

oxb*_*kes 17

仅当转换的类型还没有具有给定签名的方法时,隐式转换才有效.因为一切都有toString,所以不可能通过拉皮条来覆盖它.

你可能会做的是使用类似于(类似于scalaz.Show)的类型类,如下所示:

trait Show[-A] {
  def show(a : A): String
}
Run Code Online (Sandbox Code Playgroud)

然后你可以show在任何地方使用而不是toString.理想情况下,您想要的是使Show[Any]实例隐含的优先级非常低.

implicit val DateShow = new Show[Date] { def show(d : Date) = "whatever" }

trait LowPriorityShows {
  implicit val AnyShow = new Show[Any] { def show(a : Any) = a.toString }
}
Run Code Online (Sandbox Code Playgroud)

PS我不建议使用的原因scalaz.Show是返回类型List[Char],这对大多数用途来说是不切实际的