嵌套协方差在Kotlin中如何工作?

Animesh Sahu

这是我很难理解为什么第一次编译而第二次不编译的代码?

class Test11<T : Number> {
    lateinit var test: MutableList<out T>.() -> Unit
}

fun main() {
    val test: Test11<Int> = Test11<Int>()
    val test2: Test11<out Number> = test
    test.test.invoke(MutableList(3) { 55 })  // First
    test2.test.invoke(MutableList(3) { 55 })  // Second
}

第二个说MutableList<Nothing>是预期的。

所以基本上在第一种情况下,T => Int做出来out T => out Int => out Number可能。在第二种情况下,T => out Number那么Number的子类中的任何东西仍然out T => out Number正确吗?

我不明白为什么这种逻辑不起作用...

Tenfour04

MutableList是一个函数参数。您将遇到以下完全相同的问题:

class Test11<T : Number> {
    fun test(list: MutableList<out T>) {

    }
}

fun main() {
    val test: Test11<Number> = Test11<Number>()
    val test2: Test11<out Number> = test
    test.test(MutableList(3) { 55 })  // First
    test2.test(MutableList(3) { 55 })  // Second
}

根据定义,协变类型可以防止调用以类型为参数的函数,但是从逻辑上讲,这也扩展到相同类型的嵌套协变。如果T是协变的(对于该类),那么消耗可以产生Ts的对象比直接消耗Ts更为安全。

如何造成失败的示例:

class Test11<T : Number> {
    var list: MutableList<out T>? = null
    fun test(list: MutableList<out T>) {
        this.list = list
    }
}

fun main() {
    val test: Test11<Long> = Test11()
    val test2: Test11<out Number> = test
    val doubleList: MutableList<out Number> = mutableListOf(1.0)
    test2.test(doubleList) // Not allowed
    
    // if it were allowed:
    val long: Long? = test.list?.firstOrNull() // ClassCastException casting the Double to a Long
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Swift中可选协方差如何工作

来自分类Dev

Swift中可选协方差如何工作

来自分类Dev

Kotlin中的方差/协方差泛型

来自分类Dev

如何使数组协方差在 F# 中工作

来自分类Dev

如何计算块中的协方差矩阵?

来自分类Dev

Scala中的协方差与协方差

来自分类Dev

Scala中的协方差和协方差

来自分类Dev

OpenMP中带有嵌套循环的协方差计算

来自分类Dev

如何通过MATLAB代码在R中创建协方差矩阵?

来自分类Dev

如何找到 R 中每 n 行的协方差

来自分类Dev

Scala中的协方差和方差翻转

来自分类Dev

R中的方差-协方差矩阵

来自分类Dev

相反/协方差和嵌套泛型

来自分类Dev

NUMPY:嵌套列表的协方差矩阵

来自分类Dev

仅计算嵌套列表中数字列的组内协方差矩阵

来自分类Dev

如何计算协方差的导数/梯度?

来自分类Dev

EmguCV:如何从图像创建协方差矩阵?

来自分类Dev

如何处理协方差限制?

来自分类Dev

在Python中建立协方差矩阵

来自分类Dev

numpy中的加权协方差矩阵

来自分类Dev

协方差行为中的数组object []

来自分类Dev

在R中建立协方差矩阵

来自分类Dev

在熊猫中创建滚动协方差矩阵

来自分类Dev

如何提取特定值的方差协方差矩阵?

来自分类Dev

使用python 3如何获得协方差/方差

来自分类Dev

从OpenCV Expectation Max中的协方差矩阵计算方差

来自分类Dev

如何在R中的data.table中按类别查找协方差矩阵

来自分类Dev

如何在R的data.table中按类别查找协方差矩阵

来自分类Dev

如何在Python中获取n个数组的nxn个协方差矩阵?