Scala:在伴侣对象中使用implicits

时间:2016-12-16 13:04:17

标签: scala compiler-errors implicit-conversion implicit companion-object

我正在scala中创建伴随对象,并试图在object中使用class implictis函数而不导入。但无论何时,尝试编译代码我都会收到错误type mismatch;似乎无法自动导入implictis。以下是我的代码:

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._时,它将编译并运行正常。根据{{​​3}},它将正常工作,并且无需定义导入。

  

在这种情况下,转换 dollarToEuro 据说与之关联   美元型。编译器将找到这样的关联转换   每次需要从Dollar类型的实例转换时。   无需将转换单独导入您的程序。

我的样本出了什么问题,或者我的理解是误导性的?

2 个答案:

答案 0 :(得分:6)

  

我的样本或我的理解有问题   误导

如果您在Dollar的随播对象中定义,则转换为Dollar将与之关联。目前,所有的隐含都是在ImplicitTest5上定义的,这不是编译器在Dollar类中寻找隐含的地方。这会强制您明确导入包含这些含义的对象。相反,做:

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

有关详情,请参阅"Where does Scala look for implicits"

答案 1 :(得分:0)

默认情况下,scala编译器将查看源对象和目标对象的伴随对象。因此,例如,如果您要从Dollor转换为Euro,则隐式方法可以位于Dollor或Euro随播对象中。编译器将自动选择它。否则,您必须将其显式带入范围。