Почему `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 изменяемый, да и объявлять вариативность на уровне классов и интерфейсов нельзя