Неявные представления в сопутствующем объекте - PullRequest
4 голосов
/ 14 октября 2011

Я читал Scala In Depth Джошуа Д. Суерета и наткнулся на следующий код о неявных представлениях в scala:

object test {
  trait Foo
  trait Bar
  object Foo {
    implicit def fooToBar(f : Foo) =  new Bar{ }
  }
}

Затем определите метод, для которого в качестве аргумента требуется Bar:

def bar(x : Bar) = println("bar")

Почему работает следующее:

val f = new Foo{}
bar(f) // print "bar"

, но

bar(new Foo{})

приведет к тому, что компилятор выдаст ошибку несоответствия типов:

error: type mismatch;
found   : java.lang.Object with test.Foo
required: test.Bar
          bar(new Foo {})
              ^

1 Ответ

6 голосов
/ 14 октября 2011

Вот кое-что о том, что вы делаете:

new Foo {} // Anonymous subclass of Object with trait Foo
new Foo () // Foo
new Foo    // Foo

Когда вы делаете что-то вроде bar(new Foo {}), компилятор еще не знает, что вы делаете - он пытается найти barметод, который будет принимать new Foo {}, но пока точно не знает, что это за тип new Foo {}, потому что он зависит от того, что такое bar.

Если вы объявите val f = new Foo{}, f 'Тип s становится фиксированным, что помогает компилятору выяснить, что он должен делать с bar.

...