2011-08-04 34 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 –