Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 为什么使用声明站点差异_Generics_Kotlin_Covariance - Fatal编程技术网

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

Generics 为什么使用声明站点差异,generics,kotlin,covariance,Generics,Kotlin,Covariance,这不是Kotlin的具体问题,但我想更好地理解为什么我会使用声明站点方差(协变和逆变)。我知道如何使用它们,我只是没有看到太多的好处,或者在这种情况下,我应该选择一个而不是另一个,以及为什么我不想一直使用站点差异。声明站点使客户端更容易使用泛型类型的类,因为如果创建者在最初创建时已经做出了决定,那么您不必考虑差异创建。当使用此类泛型类时,编译器可以确定可能的差异 //declaration-site abstract class ReadableList<out T> { a

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

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

//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
    // ...
}
//声明站点
抽象类可读列表{
抽象趣味get():T
}
使用ReadableList的有趣工作(字符串:ReadableList){
val objects:ReadableList=strings//这没问题,因为T是一个out参数,ReadableList在其类型T中是协变的
// ...
}

只需看看详细的use site java语法。许多人甚至不知道
super
extends
之间的区别,也不知道差异的含义。Kotlin的关键字
in
out
更具描述性,在其他语言中也有使用。

不知道您是否阅读过Kotlin文档中的泛型部分,它为我清除了很多这方面的障碍。感谢您的澄清。我把它看作是在集合中使用声明站点差异,但它应该看作是一个类。