考虑以下代码,该代码可以正常工作:
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类声明中使用默认参数,这只是一个示例。您可能会声明一个伴随对象的原因很多。)
答案 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)