Funzioni non possono essere sovraccaricate in Scala, è corretto. Ma println
non è una funzione, è un metodo , e i metodi più possono essere sovraccaricati.
Non sono sicuro di cosa intendi con "Come è fatto". È fatto esattamente nello stesso modo in cui lo fai in ogni altra lingua che supporta il sovraccarico. Se vuoi due definizioni di un metodo con tipi diversi, scrivi due definizioni con tipi diversi:
def foo(arg: Int) { println("I am overloaded for Int.") }
def foo(arg: String) { println("I am overloaded for String.") }
foo(42)
// I am overloaded for Int.
foo("Hello")
// I am overloaded for String.
foo(1.0)
// error: overloaded method value foo with alternatives:
// (arg: String)Unit <and>
// (arg: Int)Unit
// cannot be applied to (Double)
// foo(1.0)
// ^
Il motivo per cui l'overloading function non è supportato è semplice: tecnicamente parlando, il termine non ha nemmeno senso, poiché "overloading" significa sostanzialmente (molto ampiamente) "binding diversi per lo stesso nome in base al contesto ". Ma le funzioni non hanno un nome, quindi l'intero concetto di avere diverse implementazioni legate allo stesso nome è privo di senso.