Tutte le risposte che dicono che la JVM non consente che questo sia errato. È possibile sovraccaricare in base al tipo restituito. Sorprendentemente, la JVM fa sì che ciò sia permesso da; sono i compilatori per le lingue che vengono eseguite sulla JVM che non lo consentono. Ma ci sono modi per aggirare i limiti del compilatore in Scala.
Ad esempio, si consideri il seguente frammento di codice:
object Overload{
def foo(xs: String*) = "foo"
def foo(xs: Int*) = "bar"
}
Questo sarà lanciare un errore compilatore (Poiché varargs, indicati dal *
dopo il tipo di argomento, tipo cancelli a Seq
):
Error:(217, 11) double definition:
def foo(xs: String*): String at line 216 and
def foo(xs: Any*): String at line 217
have same type after erasure: (xs: Seq)String
def foo(xs: Any*) = "bar";
Tuttavia, se si modifica il valore del secondo foo
a 3
anziché bar
(in tal modo, modificare il tipo di ritorno da String
a Int
) come segue:
object Overload{
def foo(xs: String*) = "foo"
def foo(xs: Int*) = 3
}
... si volontà non ottenere un errore di compilazione.
modo da poter fare qualcosa di simile:
val x: String = Overload.foo()
val y: Int = Overload.foo()
println(x)
println(y)
e si stamperà:
3
foo
Tuttavia, l'avvertenza di questo metodo è dover aggiungere varargs come l'ultimo (o solo argomento per le funzioni sovraccariche, ognuna con un proprio tipo distinto.
Fonte: http://www.drmaciver.com/2008/08/a-curious-fact-about-overloading-in-scala/
Vedere anche Java specifica http://stackoverflow.com/questions/2744511/java-why-no-return-type-based-method-overloading?lq=1 – nawfal
e in generale http : //stackoverflow.com/questions/442026/function-overloading-by-return-type – nawfal