Почему Scala List может принимать ковариантный тип в качестве параметра в методе +=

Scala List объявлен как

sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with     Product with GenericTraversableTemplate[A, List] with LinearSeqOptimized[A, List[A]] with java.io.Serializable

Метод для добавления элемента в список объявляется как

def +:(elem: A): List[A]

Поскольку тип A является ковариантным, почему компилятор не жалуется, так как A появляется в контравариантной позиции в +:?

1 ответ

Решение

Потому что его полная подпись:

def +:[B >: A, That](elem: B)(implicit bf: CanBuildFrom[List[A], B, That]): That

Документ, который вы упомянули в вопросе, является только упрощенным, вам нужно проверить полную подпись метода.

Другие вопросы по тегам