我正在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类型的实例转换时。 无需将转换单独导入您的程序。
我的样本出了什么问题,或者我的理解是误导性的?
答案 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)
}
}
答案 1 :(得分:0)
默认情况下,scala编译器将查看源对象和目标对象的伴随对象。因此,例如,如果您要从Dollor转换为Euro,则隐式方法可以位于Dollor或Euro随播对象中。编译器将自动选择它。否则,您必须将其显式带入范围。