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

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

da¿Por qué esta referencia es ambigua?

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 

pero añadiendo el tipo

val p: Point = peer.getMousePosition 

lo hace bien. ¿Por qué?

edición: provoca un problema:

class A { 
    def value() = 123 
} 

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

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

no causa problema:

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

class B extends A {} 

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

Así que creo que la respuesta tiene que explicar por qué sólo se produce cuando los métodos son en diferentes clases .

Respuesta

9

Hay dos métodos getMousePosition uno sin y uno con un parámetro booleano.

Sin una anotación de tipo Scala no sabe si desea una referencia al método en un parámetro (un objeto Function1) o si desea invocar el uno sin parámetros (lo que da como resultado un Point).

Especificar el tipo esperado aclara su intención.

El uso de getMousePosition() debería funcionar también.

+1

Así podemos romper el código de las personas si decidimos agregar métodos de sobrecarga a una clase ... esto no parece muy bueno. Pensé que poner un '_' después del método era la forma de convertirlo en una función parcialmente aplicada. –

+1

@Luigi Hay muchas maneras de descifrar el código de las personas agregando sobrecargas, esta es solo una forma más. –

+1

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

4

Una manera más directa de referirse a la alternativa sobrecargada deseada es incluir la lista de argumentos vacía.

peer.getMousePosition() 
Cuestiones relacionadas