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

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

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

//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的关键字有点更具描述性,也用于其他语言。