Ответ
В Kotlin дженерики по умолчанию инвариантны (out и in не указаны). Это значит, что Box<Cat> не является ни подтипом, ни надтипом Box<Animal>, даже если Cat наследует Animal.
Пример инвариантного дженерика:
class Box<T>(var item: T)
val catBox: Box<Cat> = Box(Cat())
val animalBox: Box<Animal> = catBox // Ошибка компиляции!
Для ковариантности (Box<Cat> → Box<Animal>) используется out:
class Box<out T>(val item: T)
Для контравариантности (Box<Animal> → Box<Cat>) — in:
class Box<in T>(fun consume(item: T))