Почему var с частным сеттером является инвариантной позицией?

(Я использую kotlin 1.1.2-2)

Я обнаружил, что существует два способа определения свойства, которое является переменным, но не может быть назначено через = .

  1. var с частным сеттером
  2. val с частной переменной

Я также обнаружил, что у них другое поведение.

Когда T объявлено, var типа T с частным сеттером не может быть определен, в то время как свойство val с поддержкой является законным.

 open class A<out T>(v: T) { // error because T occurs in invariant position var prop1: T = v private set private var _prop: T = v val prop2: T get() = _prop } 

Почему prop1 является инвариантным положением, а prop2 – нет? Откуда эта разница?

В вашем случае вы объявляете, что private var can – это то, что вы не можете изменить его из класса A поскольку он является private , и вы не можете объявить функцию с параметром out variance для цели модификации.

Различия между private var и private set – это private переменная, у которой нет getter / setter, а только генерируется поле в java. но свойства private set имеют геттер / сеттер, а сеттер – private .

Отклонение out только для режима чтения, что означает, что вы не можете ничего добавить в нем. и его фактический тип является подтипом T , или ? extends T ? extends T в java.

Для режима записи out эквивалент Nothing , поэтому вы не можете вообще объявить переменную setter / mutable. но вы можете ссылаться на него с неизменяемым свойством, например:

 open class A<out T>(v: T) { //v--- immutable val prop1: T = v } 

Если вы можете это сделать, общий котин – это плохо. Зачем? по определению, out T является подтипом T , но вы пытаетесь присвоить экземпляр супертипа T подтипу ? extends T ? extends T , например:

 val subInt:A<Int> = A(1); // v--- Int subInt.prop1 = 1; // you try to assign an Int to its subtype // ^--- prop1 is a subtype of Int 

Возможно, следующий пример сделает вас более понятным, почему нельзя добавлять что-либо в параметр отклонения.

 val int: A<Int> = A(1) // ok val number: A<Number> = int; //ok number._prop = 1.0; // ^ //if you can define setter/mutable variable, you try to assign a Double into a Int 
Intereting Posts
Kotlin + SpringBoot 2.0.0-M4 не удалось использовать контекст приложения загрузки (BeanCreationException) Как использовать `filter` на экземпляре карты в Kotlin? Выполните краткое описание добавления свойств класса в Котлине Ввод элемента в HashMap с интерфейсом карты Kotlin: gettng rid Unchecked casts для Comparable Запись в файл после матча в Котлине Kotlin + Mockito2: ClassNotFoundException для тестовых тестов кратные пары в карту множества; создавать записи в карте, если они уже не существуют Как преобразовать Int в строку в Kotlin Использовать статический метод в Java как метод расширения в Котлине LibGDX Scene2d UI: проблемы с таблицей внутри таблицы Получение класса не найдено Исключение при использовании KotlinJsonAdapterFactory () в Moshi 1.5 с Kotlin Kotlin неразрешимая ссылка: добавить после преобразования из Java-кода Преобразование кода Python в Kotlin Компонентные объекты обеспечивают возможность реализации интерфейсов