繁体   English   中英

为什么var与私人二传手是不变的位置?

[英]Why var with private setter is invariant position?

(我用kotlin 1.1.2-2)

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

  1. var与私人二传手
  2. val具有私有变量支持属性

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

T被宣布outvar式的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 varprivate 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM