[英]Why var with private setter is invariant position?
(我用kotlin 1.1.2-2)
我发现有两种方法来定义属性是可变的但不能通过=
赋值。
var
与私人二传手 val
具有私有变量支持属性 我还发现他们有不同的行为。
当T
被宣布out
, 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
可以工作,因为它是private
,您无法将其更改为A
类,并且您无法为修改目的声明具有out variance
参数的函数。
private var
和private set
之间的区别是private
变量没有getter / setter只是在java中生成了一个字段。 但private set
属性有getter / setter,setter是private
。
out
方差仅适用于读取模式,这意味着您无法在其中添加任何内容。 它的实际类型是T
的子类型,还是? extends T
在java中? extends T
因为out
方差的写模式等价于Nothing
,所以你根本不能声明setter
/ mutable变量。 但您可以使用不可变属性引用它,例如:
open class A<out T>(v: T) {
//v--- immutable
val prop1: T = v
}
如果你能做到,kotin generic就是一件坏事。 为什么? 顾名思义, 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
也许以下示例将更清楚地说明为什么无法在out
variance参数中添加任何内容。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.