为什么使用声明站点差异
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 语法。许多人甚至不知道 super
和 extends
之间的区别或方差的含义。 Kotlin 的关键字 in
和 out
描述性更强一些,在其他语言中也有使用。
这不是 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 语法。许多人甚至不知道 super
和 extends
之间的区别或方差的含义。 Kotlin 的关键字 in
和 out
描述性更强一些,在其他语言中也有使用。