7.11. Przeciążanie metod
Scala dopuszcza przeciążanie metod — w klasie mogą współistnieć metody mające taką samą nazwę. Taka sytuacja ma miejsce w pliku OverloadedMethods1.scala, który zawiera definicję klasy, w której umieszczone są dwie metody o nazwie add. Jedna z nich posiada dwa parametry typu Int, a druga dwa parametry typu String.
Plik OverloadedMethods1.scala: class OverloadedMethods1 { def add(x: Int, y: Int):Int = x + y def add(x: String, y: String):String = x + y }
Jak pokazują poniższe przykłady, klasa może być poprawnie używana. Wybór wywoływanej metody następuje na podstawie przekazanych jej w wywołaniu argumentów.
scala> val om1 = new OverloadedMethods1
om1: OverloadedMethods1 = OverloadedMethods1@39680d
scala> om1.add(2,4)
res0: Int = 6
scala> om1.add("ab","xy")
res1: String = abxy
scala> om1.add(6:Byte,7:Byte)
res2: Int = 13
W pewnych przypadkach jednoznaczny wybór metody nie może być skutecznie dokonany. Na przykład w poniższej próbie wywołania metody add otrzymujemy błąd kompilacji.
scala> om1.add(6L,7L)
<console>:12: error: overloaded method value add with alternatives:
(x: String,y: String)String <and>
(x: Int,y: Int)Int
cannot be applied to (Long, Long)
om1.add(6L,7L)
^
Inny problem mogący wystąpić przy definicji przeciążonych metod ilustruje klasa z pliku OverloadedMethods2.scala.
Plik OverloadedMethods2.scala: class OverloadedMethods2 { def add(x: Int, y: Int = 0):Int = x + y def add(x: String, y: String = ""):String = x + y }
Próba kompilacji klasy powoduje wystąpienie błędu.
$ scalac OverloadedMethods2.scala
OverloadedMethods2.scala:1: error: in class OverloadedMethods2, multiple overloaded alternatives of method add define default arguments.
class OverloadedMethods2 {
^
one error found
Kompilator poinformował o błędzie wynikającym z zastosowania przeciążonych metod, z których więcej niż jedna posiada parametr z argumentem domyślnym.
![]() | Specyfikacja języka Scala opisuje zasady związane z przeciążaniem w punkcie 6.26.3. |
Plik OverloadedMethods1.scala:
class OverloadedMethods1 {
def add(x: Int, y: Int):Int = x + y
def add(x: String, y: String):String = x + y
}

