Я пытаюсь склонить голову ковариации в отношении методов, создающих новые неизменяемые типы, используя нижние границы
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
?
Что мне не хватает?
Спасибо Блэр