在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]
,这对大多数用途来说是不切实际的