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

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.