スカラ暗黙の変換の問題

次のコードで暗黙の変換に問題があります。

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"

しかし、Testから import Y ._ を削除しても、コンパイルは正常です。

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

6

1 答え

Y.toB は、同じスコープで両方をインポートするときに X.toB をオーバーライドしているようです。 import Y ._ before import X ._ を入力すると動作します。また、 Y の名前を他のもの(例えば toYB )に暗黙的に変更しても、

7
追加された
そしてこれはあなたが期待するものです。 Javaの静的インポートのようなものです。暗黙のメソッドを toB(a)として呼び出した場合、後者がもう一方を上書きしなかった場合、コンパイラはどのような意味を持つのでしょうか? XB YB が異なるクラスであるため、OPは暗黙のdefsという名前を AtoXB AtoYB
追加された 著者 Luigi Plinge,
実際、どういうわけか暗黙のメソッド名が問題の原因になるとは思っていませんでした。私は名前を変更したし、今は正常に動作します、ありがとう!
追加された 著者 elk,