¿Por qué var con private setter es una position invariante?

(Yo uso kotlin 1.1.2-2)

Encontré que hay 2 maneras de definir la propiedad que es variable pero que no se puede asignar a través de = .

  1. var con setter privado
  2. val con propiedad de respaldo variable privada

También encontré que tienen un comportamiento diferente.

Cuando T se declara out , no se puede definir var del tipo T con el sistema privado, mientras que la propiedad val con respaldo es legítima.

 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 } 

¿Por qué prop1 es la position invariante y prop2 no lo es? ¿De dónde viene la diferencia?

En su caso, usted declara que la varita private var puede funcionar, es que no puede cambiarla de la class A ya que es private , y no puede declarar una function con un parámetro de out variance para el propósito de la modificación.

La diferencia entre private var y private set es una variable private do not getter / setter acaba de generar un campo en java. pero private set properties de private set tienen getter / setter y el setter es private .

La varianza de out es solo para el modo de lectura, lo que significa que no puede agregar nada en él. y su tipo de realidad es un subtipo de T , o ? extends T ? extends T en java.

Para el modo de escritura de la varianza de out es equivalente a Nothing , por lo que no puede declarar la variable setter / mutable en absoluto. pero puede referencerlo con una propiedad inmutable, por ejemplo:

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

Si puedes hacerlo, el genérico de kotin es algo malo. ¿por qué? por definición, out T es un subtipo de T , pero intenta asignar una instancia de supertipo T a un subtipo de ? extends T ? extends T , por ejemplo:

 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 

Tal vez el siguiente ejemplo te haga ver más claramente por qué no se puede agregar nada en un parámetro de varianza.

 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