为什么与私人二传手var是不变的立场?

(我用kotlin 1.1.2-2)

我发现有两种方法可以定义可变的属性,但不能通过=赋值。

  1. var与私人setter
  2. val与私有变量后台属性

我也发现他们有不同的行为。

当声明T具有私有setter的T类型的var不能被定义,而具有后备属性的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 out variance可以工作的是,你不能改变它的类A因为它是private ,你不能声明一个函数与out variance参数为修改目的。

private变量和private set变量之间的不同是一个private变量没有getter / setter只是在java中产生一个字段。 但private set属性有getter / setter和setter是private

out差异只适用于读模式,这意味着你不能添加任何东西。 其实际类型是T的子类型,还是? extends T 在java中? extends T

对于写入方式的差异相当于Nothing ,所以你根本不能声明setter / mutable变量。 但是你可以用一个不可变的属性来引用它,例如:

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

如果你能做到这一点,kotin通用是一件坏事。 为什么? 根据定义, out Tout 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