2011-08-04 33 views
8

在Java中,我会做类似在斯卡拉,是否有可能使用implicits来自动覆盖toString?

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

MyDate date = new MyDate 

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

+0

如果你想要的代码,不知道你使用正确的'toString'可行的,你会必须扩展'java.util.Date';在该对象的方法表中有一个不同的指针是它将产生一个不同的字符串的唯一方法! –

回答

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],这是不为大多数应用

+1

有关控制蕴涵优先级的解释,请参阅Daniel Sobral的书写:http://stackoverflow.com/questions/5598085/where-does-scala-look-for-implicits –