为什么与私人二传手var是不变的立场?
(我用kotlin 1.1.2-2)
我发现有两种方法可以定义可变的属性,但不能通过=
赋值。
-
var
与私人setter -
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 T
是out 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