Проблема неявного преобразования в Scala - PullRequest
6 голосов
/ 06 февраля 2012

У меня проблема с неявным преобразованием в следующем коде:

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"
}

Последний оператор в Test вызывает ошибку компиляции:

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

Однако, если я удаляю import Y._ из Test, он прекрасно компилируется.

Обратите внимание, что в реальном коде X.B и Y.B являются частью Scala DSL для библиотеки Java, и я хотел бы иметь возможность использовать оба в одном модуле компиляции.

1 Ответ

7 голосов
/ 06 февраля 2012

Похоже, что Y.toB переопределяет X.toB, когда вы импортируете оба в одной и той же области видимости.Если я поставлю import Y._ перед , то import X._, тогда это сработает.Кроме того, если я переименую Y неявно во что-то другое (например, toYB), то оно будет работать независимо от того, в каком порядке вы его поместите.

...