2012-02-06 14 views
6

私は、次のコードでは暗黙の型変換の問題を抱えている:Scalaの暗黙的な変換の問題

trait A { 
    def send(s: String): String = { 
    println(s) 
    s 
    } 
} 

object X { 
    implicit def toB(a: A): B = new B(a) 

    class B(a: A) { 
    def <<(s: String): String = a send s 
    } 
} 

object Y { 
    implicit def toB(a: A): B = new B(a) 

    class B(a: A) { 
    } 
} 

object Test extends App { 
    import X._ 
    import Y._ 
    val a: A = new A {} 
    a << "Test" 
} 

テストの最後の文は、コンパイルエラーが発生します。

error: value << is not a member of A 
a << "Test" 

しかし、私はからimport Y._を削除する場合テストして、うまくコンパイルします。

実際のコードでは、X.BとY.Bの両方がJavaライブラリ用のScala DSLの一部であり、両方を同じコンパイル単位で使用できるようにしたいとします。

答えて

7

同じスコープで両方をインポートすると、Y.toBX.toBを上書きしているようです。 import Y._の前に置き、次にimport X._にすると、動作します。また、Yの名前を他のもの(例えばtoYB)の名​​前に変更しても、それをどのような順序で入れても問題はありません。

+3

これはあなたが期待するものです。 Javaの静的インポートのようなものです。暗黙のメソッドを 'toB(a)'として呼び出すと、コンパイラは、後の方がもう一方を上書きしなかった場合にどのような意味があるのか​​をどのように知っていますか? 'X.B'と' Y.B'が異なるクラスであるため、OPはあなたが言うように 'AtoXB'や' AtoYB'のような暗黙的なdefs名を与えるべきです。 –

+0

実際、何らかの形で暗黙的なメソッド名が問題を引き起こしているとは思っていませんでした。私は名前を変更したし、今は正常に動作します、ありがとう! – elk

関連する問題