这不是科特林的特定问题,但我想更好地理解为什么我会使用声明站点差异(协变和逆转(。我了解如何使用它们,我只是看不到很多好处,或者在这种情况下,我应该选择彼此的好处,以及为什么我不想一直使用用途差异。
声明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
// ...
}
只能查看详细的用途Java语法。许多人甚至都不知道super
和extends
之间的区别或差异意味着什么。Kotlin的关键字in
和out
更具描述性,也用于其他语言。