Почему `val a: List = ArrayList()` корректный код

Если я напишу следующий код:

    val a: List<Any> = ArrayList<Int>()
    val a2: ArrayList<Any> = ArrayList<Int>() // compile error

вторая строчка ожидаемо не скомпилируется, но на мое удивление с первой все OK. Насколько мне известно, в Java так сделать бы не вышло:

    List<Object> a = new ArrayList<Integer>(); // compile error
    ArrayList<Object> a2 = new ArrayList<Integer>(); // compile error

Почему Котлин допускает такое поведение?


Ответы (1 шт):

Автор решения: IR42

В Котлине интерфейс List неизменяемый и поэтому его сделали инвариантным

public interface List<out E> : Collection<E>

https://kotlinlang.org/docs/generics.html#variance, https://kotlinlang.ru/docs/reference/generics.html

В Java интерфейс List изменяемый, да и объявлять вариативность на уровне классов и интерфейсов нельзя

→ Ссылка