请原谅长时间的设置。这个问题与Scala: ambiguous reference to overloaded definition - best disambiguation?有关,但没有回答。
我对Scala很陌生,而且让我失望的一件事就是Scala:
这两种语言功能令我感到困惑。请看下面的代码:
class MyClass { def something(in: String): String = { in + "_X" } def something: String => String = { case _ => "Fixed" } } val my = new MyClass() println(List("foo", "bar").map(my.something))
我希望通过调用与List("foo_X", "bar_X")
所需的something
参数匹配的map
原型来打印String => ?
。相反,输出为List("Fixed", "Fixed")
- Scala 2.11正在调用无参数something()
,然后将其返回值传递给map
。
如果我们注释掉something
的第二个无参数原型,输出会变为预期结果,证明另一个原型在上下文中是有效的。
将空参数列表添加到第二个原型(使其成为def something()
)也会改变行为。
将my.something
更改为my.something(_)
将Scala提升到之前默默忽略的歧义:
error: ambiguous reference to overloaded definition, both method something in class MyClass of type => String => String and method something in class MyClass of type (in: String)String match argument types (String) println(List("foo", "bar").map(my.something(_)))
即使使用所谓的用于此目的的魔术尾随下划线也不起作用:
val myFun: (String) => String = my.something _
这导致:
error: type mismatch; found : () => String => String required: String => String val myFun: (String) => String = my.something _
我的问题:
MyClass
编写(没有对原型进行任何更改,特别是不向其中一个原型添加空参数列表),我如何毫不含糊地告诉Scala我想要第一个 - something
的参数版本作为参数传递给另一个调用?map
,为什么Scala编译器不会将歧义报告为错误?foo.bar
视为等同于foo.bar()
?答案 0 :(得分:1)
我已经在Scala问题跟踪器上提交了一个错误,而且似乎共识似乎是这种行为是一个错误。编译器应该抛出关于“my.something”的模糊引用的错误。