为什么可以';我省略了“;套用;在这个例子中,在Scala中应用(_)?

为什么可以';我省略了“;套用;在这个例子中,在Scala中应用(_)?,scala,types,apply,Scala,Types,Apply,请遵守以下代码 trait Example { type O def apply(o: O) def f(o: O) = this.apply(o) } 它在Scala中编译得很好。我希望我可以像往常一样省略apply,编写def(o:o)=this(o)。但是,这会导致令人兴奋的错误消息 type mismatch; found : o.type (with underlying type Example.this.O) required:

请遵守以下代码

trait Example {
  type O
  def apply(o: O)
  def f(o: O) = this.apply(o)
}
它在Scala中编译得很好。我希望我可以像往常一样省略
apply
,编写
def(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

有人能向我解释一下发生了什么吗?

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

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

trait Example {
  def apply(o: String): String = o
  def f(o: String) = this(o)
}

当调用站点是辅助构造函数时,此(…)仅表示对构造函数的调用。剩下的时间是一个申请的电话,就像你想象的那样。

!当然,谢谢。我对此感到困惑,因为在我的示例中,我有一个
this
(例如
trait-Example{f=>…}
)的别名,而且
f(o)
是对构造函数的调用这一点不太明显。对不起,我无法推断实际问题是什么,但我明白你的观点。你能进一步解释一下吗?这是一个抽象类型的bug。请注意,如果您将类型O具体化(例如“type O=String”)或将其改为类型参数(例如“trait-example[O]”),则非编译示例有效。您是否知道此错误的问题编号?