拥有同伴对象似乎掩盖了要应用的隐式调用?

时间:2018-11-15 14:59:26

标签: scala

考虑以下代码,该代码可以正常工作:

case class Foo(s: String)
Some("bar").map(Foo)

从技术上讲,这是所谓的Foo.apply,这是隐含的。

但是现在,如果我有一个伴随对象:

case class Foo(s: String)
object Foo {
    def apply(): Foo = Foo("default")
}
Some("bar").map(Foo)

现在这行不通,因为它正在考虑Foo.type,就像对象Foo中一样。您必须明确地说.map(Foo.apply)

这是justScalaThings,还是我做错了什么?

(是的,我知道在这个简单的示例中,我可以仅在case类声明中使用默认参数,这只是一个示例。您可能会声明一个伴随对象的原因很多。)

1 个答案:

答案 0 :(得分:1)

在您的第一个示例中,只有Foo.apply个拟合.map(Foo)

在第二个示例中,您声明了一个名为Foo的对象,并取代了Foo.apply,然后尝试将其传递到map中。因为map期望类型为String => A的参数编译失败。

就我而言,您必须使用.map(Foo.apply)

例如,它也不会编译:

case class Foo()

def map[A](f: Unit => A) = ???

map(Foo)

Try it out!