添加配套项目后,无法直接调用使用类名来映射类型



当我们有一个案例类时,我们用类型的名称调用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: type

mismatch;
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

它不再extendFunction1.

方法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方法的存在。

最新更新