2011-09-21 37 views
5
import swing._ 

object PeerTest extends SimpleSwingApplication { 
    def top = new MainFrame { 
    val p = peer.getMousePosition 
    } 
} 

Perché questo riferimento è ambiguo?

error: ambiguous reference to overloaded definition, 
both method getMousePosition in class Container of type (x$1: Boolean)java.awt.Point 
and method getMousePosition in class Component of type()java.awt.Point 
match expected type ? 
val p = peer.getMousePosition 

ma aggiungendo il tipo

val p: Point = peer.getMousePosition 

rende ok. Perché?

edit: causa problema:

class A { 
    def value() = 123 
} 

class B extends A { 
    def value(b: Boolean) = 42 
} 

object Main extends App { 
    println ((new B).value) 
} 

non causa problema:

class A { 
    def value() = 123 
    def value(b: Boolean) = 42 
} 

class B extends A {} 

object Main extends App { 
    println ((new B).value) 
} 

Quindi penso che la risposta deve spiegare perché si verifica solo quando i metodi sono in classi diverse .

risposta

9

Esistono due metodi getMousePosition uno senza e uno con un parametro booleano.

Senza un tipo di annotazione Scala non sa se si desidera un riferimento al metodo di un parametro (un oggetto Function1), o se si vuole invocare l'uno senza parametri (con conseguente Point).

Specificare il tipo previsto chiarisce l'intenzione.

Utilizzare getMousePosition() dovrebbe funzionare anche.

+1

Così possiamo rompere il codice della gente se decidiamo di aggiungere metodi di sovraccarico a una classe ... questo non sembra molto buono. Ho pensato di mettere un '_' dopo che il metodo era il modo per renderlo una funzione parzialmente applicata. –

+1

@Luigi Ci sono molti modi per infrangere il codice delle persone aggiungendo sovraccarichi, questo è solo un altro modo. –

+1

http://stackoverflow.com/questions/2510108/why-avoid-method-overloading – retronym

4

Un modo più diretto per fare riferimento all'alternativa sovraccaricata desiderata è includere l'elenco di argomenti vuoto.

peer.getMousePosition() 
Problemi correlati