为什么我不能在Scala中的this.apply(_)中省略"apply"?

Sco*_*son 6 types scala apply

请注意以下代码

trait Example {
  type O
  def apply(o: O)
  def f(o: O) = this.apply(o)
}
Run Code Online (Sandbox Code Playgroud)

在Scala编译好.我希望我可以apply照常离开,写作def f(o: O) = this(o).但是,这会产生令人兴奋的错误消息

type mismatch;  found   : o.type (with underlying type Example.this.O)
                required: _31.O where val _31: Example
possible cause: missing arguments for method or constructor
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释发生了什么事吗?

Mau*_*res 11

你不能因为构造函数中的this()是对这个对象的构造函数的调用(this()在其他任何地方生成编译失败)并且不能成为apply()调用,因为它会隐藏构造函数并使其无法实现在对象中调用另一个构造函数.this(args)总是调用构造函数方法(在Java和Scala中),因此当你自己的对象中,你总是必须显式调用apply(args).


psp*_*psp 4

接受的答案是不正确的。您可以从编译良好的事实推断出实际问题是什么:

trait Example {
  def apply(o: String): String = o
  def f(o: String) = this(o)
}
Run Code Online (Sandbox Code Playgroud)

this(...) 仅表示当调用站点是辅助构造函数时对构造函数的调用。剩下的时间就是申请电话,正如您想象的那样。