Я пытаюсь склонить голову ковариации в отношении методов, создающих новые неизменяемые типы, используя нижние границы
class ImmutableArray[+T](item: T, existing: List[T] = Nil) {
private val items = item :: existing
def append[S >: T](value: S) = new ImmutableArray[S](value, items)
}
Я понимаю, что параметр типа T не может использоваться в методе добавления, поскольку он нарушает правила, но если я скажу Customer и подкласс Student, я все же могу сделать тип U Student.
Я вижу, что это работает, но почему это не является нарушением правил? Я мог понять, был ли у меня список Student, а затем добавил Customer, я мог только вернуть список Customer из-за того, что не был назначен Customer для Student, поскольку он является родительским тип. Но почему я могу использовать Student?
Что мне не хватает?
Спасибо Блэр