Given this Scala code:
object test {
def byval(a: Int) = println("Int")
def byval(a: Long) = println("Long")
def byname(a: => Int) = println("=> Int")
def byname(a: => Long) = println("=> Long")
def main(args: Array[String]) {
byval(5)
byname(5)
}
}
the call byval(5) compiles correctly, but byname fails to compile:
ambiguous reference to overloaded definition
Why? I would expect to observe the same behavior for by-value and by-name parameters with respect to overloading… How can it be fixed?
Possible workaround without overloading (in addition to what has been said earlier), if you don't want to use different method names:
That's because JVM does not support a "by-name" parameter, so Scala has to implement it in another way.
=> X
actually compiles to aFunction0[X]
, which erases toFunction0[Object]
, which makes it impossible for Scala to distinguish two methods that differ only by the expected type of a by-name parameter.