2012-10-14 19 views
5

Jestem nowy w Scala, a obecnie uczenie się o typ parametry w Scala, gdzie natknąłem się na następujący scenariusz.Podtypu i parametrów typu w Scala

Przyjmijmy, mam 2 Ćwiczenia A i B, gdzie B jest podtypem A.

class A { 
... 
} 

class B extends A { 
... 
} 

Więc mogę powiedzieć B <: A.

Czy to również oznacza List[B] <: List[A]?

+3

Jest również wyjaśnił kursy Scala od Martin Odersky (https://class.coursera.org/progfun-2012-001/lecture/83), ale musisz się zapisać, ale warto to :-) –

Odpowiedz

19

W przypadku listy, to znaczy, że B <: A rzeczywiście implikuje List[B] <: List[A], ponieważ parametr typu listy jest kowariancyjny. Tworzenie kowariantu parametru typu oznacza, że ​​może on występować tylko w kowariantnych pozycjach w definicji Listy, to znaczy może pokazywać tylko jako typ powrotu metody, a nie jako typ parametru. "Wycieczka po Scali" zawiera sekcję o numerze variance. Wikipedia ma również dobre article about variance. Trzy opcje dla wariancji parametru typu są:

  • niezmienność: C[A] nie jest podtypem C[B], bez względu na związek pomiędzy A i B jest. Przykładami są zmienne struktury danych, takie jak tablice.
  • kowariancja: B <: A oznacza C[B] <: C[A]. Przykładami są niezmienne struktury danych lub funkcje zwracania funkcji. Konwencjonalność: A <: B implikuje C[B] <: C[A]. Na przykład funkcje są sprzeczne z typami ich parametrów.
Powiązane problemy