为什么使用声明站点差异

Why use Declaration-Site Variance

这不是 Kotlin 特有的问题,但我想更好地理解为什么我会使用声明位置方差(协变和逆变)。我了解如何使用它们,只是看不到太多好处,或者在这种情况下我应该选择一个而不是另一个,以及为什么我不想一直使用 Use-site variance。

Declaration-site 使客户更容易使用具有通用类型的 class,因为如果创建者在最初创建时已经做出决定,则您不必考虑差异。当使用这样一个通用的 class 时,编译器可以确定可能的差异。

//declaration-site
abstract class ReadableList<out T> {
    abstract fun get(): T
}

fun workWithReadableList(strings: ReadableList<String>) {
    val objects: ReadableList<Any> = strings // This is OK, since T is an out-parameter, ReadableList is covariant in its type T
    // ...
}

看看冗长的 use-site java 语法。许多人甚至不知道 superextends 之间的区别或方差的含义。 Kotlin 的关键字 inout 描述性更强一些,在其他语言中也有使用。