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.

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.