2012-10-14 3 views
5

Я новичок в Scala и в настоящее время изучаю параметры типа в Scala, где я столкнулся со следующим сценарием.Параметры подтипа и типа в Scala

Предположим, у меня есть 2 класса A и B, где B является подтипом A.

class A { 
... 
} 

class B extends A { 
... 
} 

Так что я могу сказать B <: A.

Это также означает List[B] <: List[A]?

+3

Также хорошо объяснены курсы Scala от Мартина Одерского (https://class.coursera.org/progfun-2012-001/lecture/83), но вам нужно будет зарегистрироваться, но это стоит Это :-) –

ответ

19

В случае списка это B <: A действительно подразумевает List[B] <: List[A], поскольку параметр типа List является ковариантным. Создание ковариационного параметра типа означает, что оно может отображаться только в ковариантных позициях в определении List, т. Е. Оно может отображаться только как возвращаемый тип метода, а не как тип параметра. «Тур по Скале» содержит раздел о variance. Википедия также имеет хорошее article about variance. Три варианта для дисперсии параметра типа являются:

  • инвариантность: C[A] не является подтипом C[B], независимо от того, какие отношения между A и B есть. Примерами этого являются изменчивые структуры данных, такие как массивы.
  • covariance: B <: A Вмещает C[B] <: C[A]. Примерами являются неизменяемые структуры данных или возвращаемый тип функций.
  • Контравариантность: A <: B Вмещает C[B] <: C[A]. Например, функции являются контравариантными по типам их параметров.