2017-10-04 202 views
2

試圖瞭解這種隱式發現的情況 - finding implicit of an argument's type。我複製粘貼正式例如到IDE中,只是改變了方法名MUL這樣的:斯卡拉隱式參數的類型查找失敗

class A(val n: Int) { 
    def mul(other: A) = new A(n + other.n) 
} 
object A { 
    implicit def fromInt(n: Int) = new A(n) 
} 
1 mul (new A(1)) 

現在,它會導致編譯錯誤說:

value mul is not a member of Int 

我也嘗試過用字符串代替Int,這又導致編譯錯誤。

你能解釋我做錯了什麼部分嗎?

回答

3

def +(other: A) =...def mul(other: A) =...之間的區別是,Int+方法,但它沒有一個mul方法。

如果該方法存在,但不是傳遞參數類型,那麼編譯器將查找隱式轉換。包含在隱式作用域中的是傳遞的參數參數的伴隨對象。如果找到隱式轉換,則整個表達式將進行轉換評估。

如果該方法不存在,則伴隨對象中的隱式轉換不在隱式範圍內。它不會被發現,也不會發生轉換。

如果您要將implicit def fromInt(...移動到伴隨對象的外部,那麼將發生mul()轉換。

+0

哇,非常感謝!這正是問題所在。應用隱式之前,方法名稱應該已存在於對象上。 –

+1

非常有趣,當這種分辨率會有用嗎? – Mikel

+1

@Mikel;這是個好問題。我不知道爲什麼/隱含的範圍規則是爲什麼決定的。對於瞭解這一點我有點驚訝。 – jwvh