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. |
Plik MethodReturnType1.scala:
def sum2(a: Int, b: Int): Int = a + b

