9.3. Ograniczenia dolne
Ograniczenie dolne D typu T oznaczamy T >: D. W miejscu tak określonego parametru typu T może być użyty typ D lub jego nadtyp. Przykładem metody, w której przypadku użycie ograniczenia dolnego może być pożyteczne, jest metoda longerString zdefiniowana w pliku TypeParameters6.scala. Jednocześnie metoda ta ilustruje fakt, że parametry typu mogą być również stosowane w przypadku metod. Parametry te umieszcza się w nawiasach kwadratowych, po nazwie metody.
Plik TypeParameters6.scala: def longerString[A, B](a: A, b: B):Any = { if (a.toString.length >= b.toString.length) a else b }
Metoda pobiera dwa argumenty różnych potencjalnie typów i zwraca wartość tego argumentu, który ma dłuższą reprezentację tekstową. W przypadku równej długości zwracana jest wartość pierwszego argumentu. Pierwsza definicja tej metody, znajdująca się w pliku TypeParameters6.scala, nie używa ograniczenia dolnego, co ma ten negatywny skutek, że typem rezultatu metody jest Any.
scala> :load TypeParameters6.scala Loading TypeParameters6.scala... longerString: [A, B](a: A, b: B)Any scala> longerString(123,23L) res0: Any = 123 scala> longerString(123,23.0) res1: Any = 23.0 scala> longerString(45,678) res2: Any = 678
W pliku TypeParameters7.scala znajduje się poprawiona definicja metody longerString, w której typ A określono jako dolne ograniczenie typu B. W rezultacie, typem rezultatu metody jest typ B. Ostateczny typ rezultatu metody zależy od tego, jakie argumenty zostaną podane w wywołaniu metody, a więc może to być różny typ w różnych wywołaniach tej samej metody.
Plik TypeParameters7.scala: def longerString[A, B >: A](a: A, b: B):B = { if (a.toString.length >= b.toString.length) a else b }
W przypadku dwóch pierwszych wywołań poprawionej metody longerString, jej rezultatem jest typ AnyVal, będący wspólnym nadtypem typów, odpowiednio Int i Long w przypadku wywołania z wiersza oraz Int i Double w przypadku wywołania z wiersza . W przypadku ostatniego wywołania metody, w wierszu , oba argumenty są typu Int i wobec tego rezultat też jest typu Int.
scala> :load TypeParameters7.scala Loading TypeParameters7.scala... longerString: [A, B >: A](a: A, b: B)B scala> longerString(123,23L) res3: AnyVal = 123 scala> longerString(123,23.0) res4: AnyVal = 23.0 scala> longerString(45,678) res5: Int = 678