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

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

如果您在s 伴随对象中定义它,则转换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 回答
1

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

于 2019-08-13T03:56:57.490 回答