2011-08-04 1 views
8

は、私は少し不格好Scalaでは、implicitsを使用してtoStringを自動的にオーバーライドすることは可能ですか? Javaでは

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

MyDate date = new MyDate 

ような何かをするだろう。 Scalaでは、MyDateではなく通常のjava.util.Dateを使用してtoStringをオーバーライドすることは可能ですか?私は暗黙の暗示が含まれていますが、どのようなテクニックを使用しても喜んで受け入れることができます

+0

正しい 'toString'を使用することを知らないコードが必要な場合は、 'java.util.Date'を拡張する必要があります。そのオブジェクトのメソッドテーブルに異なるポインタを持つことは、別の文字列を生成する唯一の方法です! –

答えて

17

暗黙的な変換は、変換される型に特定の署名付きのメソッドがない場合にのみ機能します。すべてがtoStringであるため、これをpimpingでオーバーライドすることはできません。

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

その後、あなたの代わりにtoStringのどこにでもshowを使用することができます:あなたが行う可能性がありますどのような

はこのようになります(scalaz.Showに似)型クラスを使用しています。理想的には、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 –

関連する問題