Tag: 协方差

为什么使用声明 – 站点差异

这不是一个Kotlin的具体问题,但我想更好地理解为什么我会使用声明站点方差(协变和逆变)。 我知道如何使用它们,我只是没有看到太多的好处,或者在哪种情况下,我应该选择一个优先于另一个,为什么我不想一直使用Use-site方差。

为什么与私人二传手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不是? 差异从哪里来?

一个协变类型参数可以在构造函数的输入位置吗?

在这个答案中 , Michael建议将泛型类型参数作为协变量,以允许创建一个空节点。 由于Tree<T>及其子类型的所有属性都是只读的( val ),因此泛型类型参数位于所有输出位置。 但是它在构造函数的输入位置中具有类型参数。 我认为这个代码在C#中不起作用,所以我尝试了一下,而且我感到惊讶,它工作得很好。 // See this: https://stackoverflow.com/questions/36753579/algebraic-data-types-in-kotlin // Short url: https://stackoverflow.com/a/36753782/303685 interface ITree<out T> { } class Tree<T>: ITree<T> { } sealed class Node<T> : Tree<T> { private readonly T _left; private readonly T _right; public Node(T left, T right) { _left = left; _right = right; } public T […]