2017-08-21 7 views
1

私は、継承された暗黙の低い優先順位のために、私が思うには曖昧なimplicitsを持つ次のScalaを持っています。しかしそれはしません - ambiguous implicit values - エラーで失敗します。優先順位がここではうまくいかない理由を誰かに説明することはできますか?Scala:暗黙の解決、あいまいさ、逆転

trait Printer[-T] { 
    def prettify(instance:T): String 
} 

trait LowPriorityPrinter { 
    implicit val anyPrinter:Printer[Any] = new Printer[Any]{ def prettify(instance:Any) = instance.toString() } 
} 

object Printer extends LowPriorityPrinter { 
    implicit val intPrinter = new Printer[Int]{ def prettify(instance:Int) = instance.toString() } 
} 

object MyApp extends App { 

    def prettyprint[T](i:T)(implicit p:Printer[T]) = println(p.prettify(i)) 
    prettyprint(234) 

} 
+0

https://groups.google.com/forum/#!topic/scala-language/ZE83TvSWpT4 – cchantep

答えて

2

問題は単純ですが、厄介です。 LowPriorityPrinterキャッチは、あなたのタイプのクラスのすべてのインスタンスではないAnyため、汎用的にする必要がある:

object Printer { 
    implicit val intPrinter: Printer[Int] = 
    new Printer[T]{ def prettify(x: T) = x.toString() + " (int") } 
    implicit def anyPrinter[T]: Printer[T] = 
    new Printer[T]{ def prettify(x: T) = x.toString() + " (general) } 
} 

基本的には、リテラル234は同じくらいIntそれとしてAnyなどで、これらのタイプのどちらがより具体的ですもう一方(優先トリックは役に立たない)です。

関連する問題