2016-11-21 3 views
5

Дано:Scala: неявно неявного класса

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) означает, что существует неявное преобразование из Int в Foo. Поэтому implicitly[Int => Foo] должен работать.

Думайте об этом так: если бы вы могли вызвать Foo с implicitly[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

Смежные вопросы