2011-10-19 13 views
7

Załóżmy, że mam dwie metody zdefiniowane z tą samą nazwą i powrotu, ale różnych params:Czy mogę uzyskać funkcję z przeciążonej metody w scala?

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

Teraz chcę przekonwertować jeden z nich do funkcji. Jeśli metoda nie były przeciążone, chciałbym to zrobić:

val f = overload _ 

Ale ponieważ jest to kompilator słusznie narzeka dwuznacznym odniesieniem. Czy istnieje sposób na to, aby funkcja jednej lub drugiej metody przeciążania była inna niż zmiana nazwy jednego z nich?

Dzięki!

John

Odpowiedz

15

Sposób kompilator wie, które overload zadzwonić, gdy nazywają go bezpośrednio to znając typ argumentu to zaaplikowana. overload someInt może odnosić się tylko do overload(x: Int), więc nie ma dwuznaczności.

Kiedy tworzysz z niego funkcję, nie podałeś argumentu (jeszcze), więc kompilator nie ma pojęcia, jaki typ ma być twoją funkcją, więc nie wie, który adres overload masz na myśli do.

Prosty sposób, aby naprawić to wyraźnie powiedzieć, że typ:

val f : Int => String = overload _ 

czyli

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

czyli

val f = overload (_ : Int) 

(uwaga: nie mam przetestowane jeszcze, ale niektóre warianty na nich powinny działać)

+0

Dzięki Ben. Dam im spin. – jxstanford

Powiązane problemy