2011-10-19 15 views
7

Digamos que tengo dos métodos definidos con el mismo nombre y de retorno, pero diferentes parametros:¿puedo obtener una función de un método sobrecargado en Scala?

def overload(x: Int) = x.toString 
def overload(s: String) = s 

Ahora quiero convertir uno de ellos a una función. Si el método no estaban sobrecargados, Me gustaría hacer esto:

val f = overload _ 

Pero ya que es, el compilador se queja con razón de una referencia ambigua. ¿Hay alguna manera de hacer una función de uno u otro de los métodos de sobrecarga que no sea cambiar el nombre de uno de ellos?

Gracias!

John

Respuesta

15

La forma en la que el compilador sabe overload a llamar cuando se llame directamente es si se conoce el tipo del argumento al que se aplica. overload someInt solo puede estar refiriéndose a overload(x: Int), por lo que no hay ambigüedad.

Cuando realiza una función, no ha proporcionado un argumento (todavía), por lo que el compilador no tiene idea de qué tipo quiere que sea su función, por lo que no sabe a qué overload se refiere. a.

La forma más fácil de solucionar esto es para decir explícitamente que el tipo:

val f : Int => String = overload _ 

o:

val f = (x : Int => overload x) 

o:

val f = overload (_ : Int) 

(nota: no lo he hecho probado estos todavía, pero alguna variación en ellos debería funcionar)

+0

Gracias Ben. Les daré un giro. – jxstanford

Cuestiones relacionadas