1

我在scala中创建伴侣对象并试图在class中尝试使用object隐含功能而不导入。但是,无论何时,试图编译代码我得到一个错误type mismatch;似乎它不能自动导入implictis。以下是我的代码:Scala:在伴侣对象中使用隐含

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类型的实例转换时,编译器都会找到这样的关联转换 。 无需将转换单独导入到您的程序中。

我的样品出现问题或我的理解有误导性?

回答

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"

+0

嘿@Yuval,如果我们在本书一看,美元是不是我们的'情况下class',这是简单的类。 –

+0

@HarmeetSinghTaara无关紧要,无论是“case class”还是“class”,它都会查看它是否有定义的伴侣对象,如果有,请在其中查找隐含对象。它不会在'Dollar'上隐式定义'ImplicitTest5'。 –

+0

嘿@Yuval我明白你的观点,我的理解是误导。谢谢你的帮助。 –