当我们有一个案例类时,我们用类型的名称调用map类型,例如:
case class Foo(value: String)
val value = Some("Yay!")
val foo = value.map(Foo)
但是,如果我们还提供一个配套对象,这将停止工作value.map(Foo)
并且看起来像这样工作:value.map(Foo(_))
.为什么?
case class Foo(value: String)
object Foo {}
val value = Some("Yay!")
val foo = value.map(Foo)
println(foo)
ScalaFiddle.scala:5: error: typemismatch;
found : ScalaFiddle.this.Foo.type
required: scala.this.Function1[lang.this.String,?]
val foo = value.map(Foo)
如果根本不定义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
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
方法的存在。