2016-11-21 240 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