2016-11-21 241 views
5
隱含類

考慮:斯卡拉:隱式

implicit class Foo(val i: Int) { 
    def addValue(v: Int): Int = i + v 
} 

是可以適用於任何implicitly? 我這裏得到一個錯誤:

<console>:14: error: could not find implicit value for parameter e: Foo 
     implicitly[Foo] 
+0

'隱式地[Foo](4)'將返回'res0:Foo = Foo @ 5d5eef3d'。 –

+0

這是因爲'val foo:Foo = 4'編譯的原因。 –

回答

6

implicit class Foo(val i: Int)意味着有一個隱式轉換IntFoo。所以implicitly[Int => Foo]應該工作。

想一想吧:如果你能召喚一個Fooimplicitly[Foo],你會期望得到Foo嗎? A Foo(0)? A Foo(1)? A Foo(2)

0

對於進一步的細節,

implcitly關鍵字可以如以下

implitly說明[T]是指在上下文中的類型T的返回隱含值

這意味着,隱含地獲得Foo您需要在範圍

中創建一個隱含值

例如,

implicit class Foo(val i: Int) { 
    def addValue(v: Int): Int = i + v 
} 

implicit val foo:Foo = Foo(1) 
val fooImplicitly = implicitly[Foo] // Foo(1) 

另外,還要注意Foo本身只是一個類,

但是通過把隱含的關鍵字在類定義的前面,

編譯器創建類型的隱函數Int => Foo