Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 拥有一个伴生对象似乎会使隐式调用无法应用?_Scala - Fatal编程技术网

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。不能将类型作为参数传递,因为类型仅在编译时传递,这是两件不同的事情。不管怎样,我很高兴能帮上忙。