2011-12-24 32 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

相關問題