2012-06-07 40 views
8

在斯卡拉IDE我得到了類下面的錯誤,我編譯:斯卡拉 - 奇怪的編譯錯誤(該方法的多個重載方案定義默認參數)

在對象MapArea,方法的多個重載替代

addAnim 定義默認參數。

所以是的,他們這樣做!所以呢?我不明白這個理念...

UPDATE:

事實證明,有可能是一種情況,編譯器無法知道該選擇哪種方法(由托馬斯Nurkiewicz指出) ,好吧,我明白..但在我的情況下,這兩種方法可以清楚地區分。這裏是代碼的確切件(與所有的原始名稱和東西保存這段時間):

def addAnim (name: String, x: Float, y: Float, tex: Buffer[Texture], fps: Int, percent: Float = 0): TImageSequence = 
    addAnim (name, x, y, tex(0).getImage.getWidth, tex(0).getImage.getHeight, tex, fps, percent) 

    def addAnim (name: String, x: Float, y: Float, w: Float, h: Float, tex: Buffer[Texture], fps: Int, percent: Float = 0): TImageSequence = { 
    // do stuff 
    } 
+2

聽起來像Scala不允許使用此功能,因爲可能會產生無法解決的歧義,即使某些情況下不含糊。既然如此,你的選擇就是給你的函數賦予不同的名字,或者用Scala項目提出一個功能請求。 – Ben

+1

即使在你的情況下,它可能運作良好,不要忘記,其他特徵可以與你的類型相結合。這可能會帶來更多含糊之處。 Scala開發者做出的決定對我來說似乎有點嚴格,我同意這種看法,似乎它可以在一定程度上得到緩解。但是,嘿,就是這樣。正如@Ben指出的那樣,您始終可以提交功能請求。 – Madoc

回答

9

不可能有兩個使用默認參數且名稱相同的方法。 Scala會根據目標方法的名稱生成獲取名稱默認值的方法,因此可能會發生某種名稱衝突。

scala> object Test { 
    | def m(i: String = "Default value") {} 
    | } 
defined module Test 

scala> Test.`m$default$1` 
res0: String = Default value 
5

你是不是顯示你的代碼,但這裏是一個簡單的例子:

object C { 
    def addAnim(x: Int = 42) {} 
    def addAnim(y: String = "abc") {} 
} 

如果我現在電話:

C.addAnim() 

應調用哪種方法?對象C不會編譯,因爲編譯器無法猜測哪個方法在不提供任何參數時的意思。

+0

查看更新.. – noncom

3

爲什麼不把兩種方法結合在一起使用w和h也是可選的,例如,

def addAnim (name: String, 
    x: Float, y: Float, 
    tex: Buffer[Texture], 
    fps: Int, 
    percent: Float = 0, 
    w: Float = Float.NaN, h:Float = Float.NaN): TImageSequence