为何使用声明 - 站点差异

时间:2017-06-26 04:26:28

标签: generics kotlin covariance

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

1 个答案:

答案 0 :(得分:3)

声明网站使客户更容易使用具有泛型类的类,因为如果创建者在最初创建时已经做出决定,则不必考虑差异。使用这样的泛型类时,编译器可以确定可能的差异。

//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更具描述性,也可用于其他语言。