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の一部であり、両方を同じコンパイル単位で使用できるようにしたいとします。
これはあなたが期待するものです。 Javaの静的インポートのようなものです。暗黙のメソッドを 'toB(a)'として呼び出すと、コンパイラは、後の方がもう一方を上書きしなかった場合にどのような意味があるのかをどのように知っていますか? 'X.B'と' Y.B'が異なるクラスであるため、OPはあなたが言うように 'AtoXB'や' AtoYB'のような暗黙的なdefs名を与えるべきです。 –
実際、何らかの形で暗黙的なメソッド名が問題を引き起こしているとは思っていませんでした。私は名前を変更したし、今は正常に動作します、ありがとう! – elk