Scala 拥有一个伴生对象似乎会使隐式调用无法应用?
考虑一下这个代码,它是有效的:Scala 拥有一个伴生对象似乎会使隐式调用无法应用?,scala,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
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中一样。您必须明确地说.mapFoo.apply
这只是一个玩笑,还是我做错了什么
是的,我知道在这个简单的例子中,我可以在case类声明中默认参数,这只是一个例子。声明伴随对象的原因很多。在第一个示例中,只有Foo.apply fitting.mapFoo 在第二个示例中,您声明了一个名为Foo的对象,取代了Foo.apply,然后尝试将其传递到映射中。因为map需要String=>类型的参数,所以编译失败 因此,就我而言,您必须使用.mapFoo.apply 例如,此示例也不会编译:
case class Foo()
def map[A](f: Unit => A) = ???
map(Foo)
谢谢在搞乱它之后,这也是我的结论,因为现在不清楚是指Foo.apply还是Foo.type,所以必须指定。我想确定我没有错过什么。谢谢不是Foo.type,是Foo。您正试图传递对象Foo。不能将类型作为参数传递,因为类型仅在编译时传递,这是两件不同的事情。不管怎样,我很高兴能帮上忙。