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我明白你的觀點,我的理解是誤導。謝謝你的幫助。 –