2
sealed trait Option[+A]
case object None extends Option[Nothing]
case class Some[A](get: A) extends Option[A]
class C1() {}
class C2() extends C1 {}
val x1: Some[C1] = Some(new C2) //> x1 : T.Some[T.C1] = Some([email protected])
val x2: Some[C2] = Some(new C2) //> x2 : T.Some[T.C2] = Some([email protected])
// val x3: Some[C1] = x2 // Type mismatch
Какова цель +A
в Some[+A]
? Если я определяю его как Some[A]
, он тоже будет ковариантным, я понимаю, что он наследует ковариацию от Option[A]
.ковариации в подклассе
Отредактировал мой вопрос, что-то странное происходит. Разве это нарушает принцип замещения, или я пропускаю что-то простое? –
@VictorMoroz: в вашем обновлении аннотация типа на 'x1' выводит вывод типа RHS, поэтому' new C2' выводится на тип 'C1'. Поместите параметр типа 'C2' на' Some', и вы получите сообщение об ошибке. –