2

scala でコンパニオン オブジェクトを作成し、インポートせずobjectに暗黙の関数を使用しようとしています。classしかし、コードをコンパイルしようとすると、エラーが発生しますtype mismatch;。暗黙的に自動的にインポートできないようです。以下は私のコードです:

object ImplicitTest5 {
    implicit def dollarToRupa(dollar: Dollar): Rupa = { 
        println("calling .... dollarToEuro") 
        Rupa(dollar.value)
    } 

    implicit def dollarToEuro(dollar: Dollar): Euro = { 
        println("calling .... dollarToEuro") 
        Euro(dollar.value)
    } 
}

case class Dollar(value: Double)

case class Euro(value: Double)

case class Rupa(value: Double)

class ImplicitTest5 { 

    private val value = "String"

    def conversion = {
        val euro: Euro  = Dollar(3.1)
        println(s" ----- $euro")
    }
}

クラスで使用import ImplicitTest5._している場合、コンパイルして正常に実行されます。Programming in Scala, Page: 478によると、問題なく動作し、インポートを定義する必要はありません。

この場合、変換DollarToEuroはタイプ Dollar に関連付けられていると言われています。コンパイラは、Dollar 型のインスタンスから変換する必要があるたびに、そのような関連付けられた変換を見つけます。変換をプログラムに個別にインポートする必要はありません。

私のサンプルで何か問題が発生していますか、それとも私の理解が誤解を招いていますか?

4

2 に答える 2

7

サンプルに問題がある、または理解が誤解を招く

コンパニオンオブジェクト内で定義すると、への変換Dollarが関連付けられます。Dollar現在、すべての暗黙は で定義されています。これは、コンパイラがクラスImplicitTest5に関して暗黙を探す場所ではありません。Dollarこれにより、これらの暗黙を含むオブジェクトを明示的にインポートする必要があります。代わりに、次のようにします。

case class Dollar(value: Double)
object Dollar {
  implicit def dollarToEuro(dollar: Dollar): Euro = {
    println("calling .... dollarToEuro")
    Euro(dollar.value)
  }
}

詳細については、「Scala が暗黙を探す場所」を参照してください。

于 2016-12-16T13:16:03.277 に答える