2011-12-24 72 views
6

遵守以下代码为什么我不能在Scala中省略this.apply(_)中的“apply”?

trait Example { 
    type O 
    def apply(o: O) 
    def f(o: O) = this.apply(o) 
} 

其中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 

谁能给我解释一下这是怎么回事?

回答

4

接受的答案不正确。你可以推断出实际的问题是一个事实,即该编译罚款什么:

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

这个(...)仅表示在一个构造函数的调用时调用的位置是一个辅助的构造。就像你想象的那样,剩下的时间是一个应用的调用。

+0

对不起,我没有推断出实际的问题,但我明白了你的观点。你能否进一步解释? – 2011-12-28 04:21:04

+0

这是一个抽象类型的错误。注意,如果你使O型具体化(例如“type O = String”),或者如果你把它变成一个类型参数(例如“trait Example [O]”),那么非编译的例子就可以工作。) – extempore 2011-12-29 05:21:23

+0

你碰巧知道问题编号为这个错误? – 2012-01-02 20:41:14

11

你不能因为()这个一个构造函数里面是这个对象的构造函数的调用(()这个其他地方产生编译失败),不能制作成适用()通话因为它会隐藏构造函数,并且无法在对象中调用另一个构造函数。 这个(args)总是调用构造方法(在Java和Scala中),所以当你在自己的对象中时,你总是必须明确地调用apply(args)

+0

唉!当然,谢谢。我对此感到困惑,因为在我的例子中,我为'this'设置了一个别名(例如'trait Example {f => ...}'),不知何故,'f(o)'是一个调用一个构造函数。 – 2011-12-24 20:58:45

相关问题