当我尝试从方法调用中省略点时,例如在此示例程序中:
object Test extends Application {
val baz = new Baz
var foo = baz bar
println(foo)
}
class Baz {
def bar = "bar"
}
我收到奇怪的错误。第一个是
error: recursive method foo needs type: println foo
,另一个是error: type mismatch; found: Unit, required: Int, println(foo)
。如果我指定foo
的类型应为String,则将以某种奇怪的方式解决第一个错误。在我在baz
和bar
之间加一个点之前,第二个不会消失。这是什么原因造成的?为什么Scala认为baz bar
是一种递归方法?
最佳答案
您看到的问题是,如果省略点,则代码不明确。编译器会将表达式视为
var foo = baz.bar(println(foo))
因此
foo
是递归定义的,并且StringOps.apply
方法需要一个Int
参数(由于String
没有StringOps
方法,因此String
将隐式转换为apply
)。调用带有一个非
Unit
参数的方法时,应仅使用类似于语法的运算符,以避免此类歧义。
关于scala - Scala中的 "recursive method <method name> needs type"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3617830/