在Java中,我会做类似
的事情class MyDate extends java.util.Date {
public String toString() { ... }
}
MyDate date = new MyDate
有点笨重。在Scala中,是否可以覆盖toString,同时仍然使用常规的java.util.Date而不是MyDate。我有一个暗示涉及但很乐意使用任何技术
答案 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]
,这对于大多数用途来说是不切实际的