7.3. Typ rezultatu metody

Deklarując metodę można wyspecyfikować typ jej rezultatu. W tym celu, po nazwie metody, po ewentualnej deklaracji parametrów, należy umieścić znak dwukropka oraz deklarację typu. Metoda sum2, pokazana wcześniej, może być zdefiniowana wraz ze specyfikacją typu tak, jak w pliku MethodReturnType1.scala.

Plik MethodReturnType1.scala:
def sum2(a: Int, b: Int): Int = a + b

Jeśli kompilator może wywnioskować typ rezultatu metody, to deklaracja typu jest opcjonalna. W powyższej definicji jest ona opcjonalna. Metoda pobiera dwa parametry typu Int i zwraca ich sumę. Suma dwóch liczb typu Int daje w wyniku rezultat typu Int. Kompilator może to wywnioskować i dlatego deklaracja typu nie jest wymagana.

Plik MethodReturnType2.scala:
def sum2d(a: Int, b: Int): Double = a + b

Definicja metody sum2d, z pliku MethodReturnType2.scala, zawiera deklarację typu, która powoduje, że wynik wyrażenia a + b jest zamieniany na typ Double.

scala> :load MethodReturnType2.scala
Loading MethodReturnType2.scala...
sum2d: (a: Int, b: Int)Double

scala> sum2d(1,2)
res0: Double = 3.0

Sytuacją, w której deklaracja typu metody może być konieczna, jest przypadek definiowania metody rekurencyjnej — wywołującej samą siebie.

Plik MethodReturnType3.scala:
def sum(a: Int): Int = if (a > 0) a + sum(a-1) else 0

W pliku MethodReturnType3.scala jest zdefiniowana metoda obliczająca sumę liczb naturalnych mniejszych lub równych podanemu argumentowi. Metoda ma jawnie podany typ wyniku.

scala> :load MethodReturnType3.scala
Loading MethodReturnType3.scala...
sum: (a: Int)Int

scala> sum(4)
res1: Int = 10

W pliku MethodReturnType4.scala znajduje się definicja metody sum nie mająca jawnie podanego typu wyniku.

Plik MethodReturnType4.scala:
def sum(a: Int) = if (a > 0) a + sum(a-1) else 0

Próba kompilacji tej metody kończy się błędem.

scala> :load MethodReturnType4.scala
Loading MethodReturnType4.scala...
<console>:11: error: recursive method sum needs result type
       def sum(a: Int) = if (a > 0) a + sum(a-1) else 0
                                        ^

Deklaracja typu metody rekurencyjnej nie zawsze jest konieczna. Nie jest konieczna, gdy metoda rekurencyjna nadpisuje inną metodę z klasy nadrzędnej. Zdefiniowana w pliku MethodReturnType5.scala metoda sum z klasy Sum jest rekurencyjna, a mimo to jej definicja nie zawiera jawnej deklaracji typu.

Plik MethodReturnType5.scala:
abstract class AbstractSum {
  def sum(a: Int): Int
}
class Sum extends AbstractSum {
  def sum(a: Int) = if (a > 0) a + sum(a-1) else 0
}

Jednak ta metoda nadpisuje zadeklarowaną w klasie bazowej abstrakcyjną metodę, której typ rezultatu jest znany. Wobec tego definicja tej metody może być poprawnie skompilowana.

scala> (new Sum).sum(4)
res2: Int = 10

Specyfikacja języka Scala opisuje możliwość opuszczenia typu rezultatu metody nadpisującej inną metodę w punkcie 4.6.5.

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.