2012-06-07 6 views
8

In Scala IDE ottengo il seguente errore sulla classe sono da compilare:Scala - strano errore di compilazione (alternative multiple sovraccariche di un metodo di definire gli argomenti di default)

in oggetto MapArea, molteplici alternative di overload di metodo addAnim definire gli argomenti predefiniti.

Quindi sì, lo fanno! E allora? Non capisco la filosofia di questo ...

UPDATE:

Si scopre che ci potrebbe essere una situazione in cui il compilatore non può sapere quale metodo per scegliere (come sottolineato da Tomasz Nurkiewicz) , ok capisco .. ma nella mia situazione questi due metodi possono chiaramente essere distinti. Ecco il pezzo esatto di codice (con tutti i nomi originali e roba conservato questa volta):

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

Sembra che Scala non consenta questa funzione a causa della possibilità di creare ambiguità irrisolvibili, anche se alcuni casi non sono ambigui. Stando così le cose, le tue opzioni sono di dare nomi diversi alle tue funzioni, o di presentare una richiesta di funzione con il progetto Scala. – Ben

+1

Anche se nel tuo caso, potrebbe funzionare bene, non dimenticare che altri tratti possono essere combinati con il tuo tipo. Ciò potrebbe portare a più ambiguità. Anche la decisione presa dagli sviluppatori di Scala mi sembra un po 'severa, e condivido l'idea che sembra che possa essere alleviata in una certa misura. Ma, hey, è così. Come sottolineato da @Ben, puoi sempre presentare una richiesta di funzionalità. – Madoc

risposta

9

Non è possibile avere due metodi con i parametri predefiniti e con lo stesso nome. Scala genera metodi per ottenere valori predefiniti con nomi basati sul nome del metodo di destinazione, pertanto potrebbe verificarsi una sorta di collisione del nome.

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

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

Non sta mostrando il codice, ma qui è un semplice esempio:

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

Se io ora call:

C.addAnim() 

quale metodo deve essere richiamato? L'oggetto C non verrà compilato perché il compilatore non è in grado di indovinare quale metodo addAnim indichi quando non fornisce alcun argomento.

+0

vedere l'aggiornamento .. – noncom

3

Perché non combinare entrambi i metodi in uno rendendo w e h facoltativi, ad es.

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 
Problemi correlati