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

时间:2011-08-04 10:40:22

标签: scala

在Java中,我会做类似

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

MyDate date = new MyDate

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

1 个答案:

答案 0 :(得分:17)

只有在转换的类型还没有具有给定签名的方法时,隐式转换才有效。由于所有内容都有toString,因此无法通过拉皮条来覆盖它。

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

trait Show[-A] {
  def show(a : A): String
}

然后,您可以在任何地方使用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 }
}

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