Я изучаю Принципы функционального программирования в Scala, когда читал лекцию Подтипы и обобщения, у меня возникла путаница по поводу ковариации:
Дано: NonEmpty <: IntSet
или NonEmpty
является подтипом IntSet
Является ли List[NonEmpty] <: List[IntSet]
или List[NonEmpty]
подтипом List[IntSet]
?
И ответ таков: список непустых множеств - это частный случай списка произвольных множеств.
Означает ли этот ответ, что List[NonEmpty]
является подтипом List[IntSet]
?
Итак, я попробовал это:
val nonEmpty: List[NonEmpty] = null
val intSet: List[IntSet] = nonEmpty
Затем у меня возникла ошибка компиляции:
Выражение типа List [NonEmpty] не соответствует ожидаемому типу List [IntSet]
Насколько я знаю, дженерики инвариантны в Java, ковариантны ли дженерики в Scala, или я неправильно понимаю согласованность?
Редактировать:
Вот определения IntSet, NonEmpty, List
:
abstract class IntSet {
def contains(x: Int): Boolean
def incl(x: Int): IntSet
def union(other: IntSet): IntSet
}
class NonEmpty(elem: Int, left: IntSet, right: IntSet) extends IntSet {...}
trait List[T] {
def isEmpty: Boolean
def head: T
def tail: List[T]
}
List
). Какие определения дляNonEmpty
иIntSet
? - person Alexey Romanov   schedule 15.06.2016scala.collection.immutable.List[+A]
ковариантен наA
, что обозначено символом+
. - person J Cracknell   schedule 15.06.2016