Если вы вообще не определяете object Foo
, тогда объект синтетического компаньона имеет следующее объявление:
<synthetic> object Foo
extends scala.runtime.AbstractFunction1[String,Foo]
with Serializable
Но если вы определите свой собственный object Foo
следующим образом
case class Foo(v: String)
object Foo {}
тогда объявление объекта Foo
изменяется соответственно на:
object Foo extends scala.AnyRef with Serializable
и больше не extend
s Function1
.
Метод apply(v: String): Foo
все еще автоматически генерируется на Foo
, но он больше не реализует интерфейс Function1[String, Foo]
.Если вы объявляете объект-компаньон следующим образом:
object Foo extends (String => Foo) { ... }
, тогда вы снова можете использовать его в выражениях, подобных value.map(Foo)
.
Синтаксис value.map(Foo(_))
всегда работает, потому что онпросто ярлык для
value.map(x => Foo.apply(x))
и замыкание не заботится о том, какие интерфейсы реализованы Foo
, оно заботится только о существовании метода apply
.