Scala中的"递归方法<方法名称>需要类型"是什么意思?

mra*_*ers 5 scala

当我尝试从方法调用中省略点时,例如在此示例程序中:

object Test extends Application {
  val baz = new Baz
  var foo = baz bar
  println(foo)
}

class Baz {
  def bar = "bar"
}
Run Code Online (Sandbox Code Playgroud)

我得到了奇怪的错误.第一个是error: recursive method foo needs type: println foo,另一个是error: type mismatch; found: Unit, required: Int, println(foo).如果我指定类型foo应该是String ,则第一个错误以某种奇怪的方式修复.在我baz和之间放一个点之前,第二个不会消失bar.这是什么原因?为什么Scala认为这baz bar是一种递归方法?

Mor*_*itz 7

你看到的问题是,如果你省略了点代码是不明确的.编译器会将表达式视为

var foo = baz.bar(println(foo))
Run Code Online (Sandbox Code Playgroud)

因此foo是递归定义的,StringOps.apply方法需要一个Int参数(String将被隐式转换StringOpsString没有apply方法).

在调用带有一个非Unit参数的方法时,您应该只使用类似于运算符的语法来避免这种歧义.