2015-05-28 111 views
2

隱含參數我公司擁有一批包裝這樣找不到伴侶類

class NumWrapper[A<:AnyVal](var v: A)(implicit n:Numeric[A]) { 
    def +(other: A): NumWrapper[A] = { 
    new NumWrapper(n.plus(v, other)) 
    } 

    def -(other: A): NumWrapper[A] = { 
    new NumWrapper(n.minus(v, other)) 
    } 
} 

所有做工精細。但是,當我想擁有的隱式轉換,我創建了一個同伴類如下:

object NumWrapper { 
    implicit def toNumWrapper[A<:AnyVal](v: A) = new NumWrapper[A](v) 
} 

但我在編譯錯誤:

找不到參數n內含價值:數字[ A]

這裏有什麼問題?爲什麼它試圖在編譯時找到類型A的隱式匹配?

非常感謝您的幫助。

回答

1

Scala中的隱式檢查在編譯時執行(它是一種靜態類型語言)。如果編譯器無法識別在呼叫位置可用的單一的,明確的,匹配的隱式值,它會抱怨。你可以在這裏解決這個

一種方法是隱式需求添加到toNumWrapper方法:

object NumWrapper { 
    implicit def toNumWrapper[A<:AnyVal](v: A)(implicit n:Numeric[A]) = new NumWrapper[A](v) 
} 

這推動了一個隱含的數字的需求量的出到需要隱式轉換的位置,例如,在控制檯,然後我可以寫:

scala> val chk1 = 3L 
chk1: Long = 3 

scala> val chk2 = NumWrapper.toNumWrapper(chk1) 
chk2: NumWrapper[Long] = [email protected] 

,編譯器很高興,因爲(我認爲 - 不完全肯定這一點),Long值帶有自己的隱式數值[龍]與它。

+0

太好了。這解決了這個錯誤。非常感謝。 –

0

根據你的代碼,

class NumWrapper[A<:AnyVal](var v: A)(implicit n:Numeric[A]) 

調用new NumWrapper[MyType](v)一個Numeric[MyType]必須在隱決議的範圍。

所以,當你有

object NumWrapper { 
    implicit def toNumWrapper[A<:AnyVal](v: A) = new NumWrapper[A](v) 
} 

這是調用此NumWrapper構造函數中,Numeric[A]必須解決。事實並非如此,編譯器提出了所提到的錯誤。