Ах, нашел ответ на свой вопрос:
Хитрость в том, что MutableList наследует обычный список:
public interface MutableList<E> : List<E>, MutableCollection<E>
И интерфейс обычного списка ковариантен в E
:
public interface List<out E> : Collection<E>
Итак, если я изменю свой исходный код на:
var anyList: MutableList<Any> = mutableListOf<String>("123") //doesn't compile any longer
var intList: MutableList<Int> = mutableListOf<Int>(1)
anyList = intList //won't work either
ОБНОВЛЕНИЕ
Как указано в комментарии
С Array это совсем другое. Это работает, потому что я не пытался явно определить тип в правой части инструкции, и поэтому Array<Any>
выводится независимо от значений, которые я передал в качестве параметров arrayOf()
public inline fun <reified @PureReifiable T> arrayOf(vararg elements: T): Array<T>