Kotlin中的相反性

士兵

我从来没有真正理解过Java中的泛型,所以Kotlin就是这种情况。考虑以下代码片段(这是一个人为的示例):

class AnyComparator: Comparator<Any> {
    override fun compare(o1: Any, o2: Any): Int {
        TODO("not implemented")
    }
}


fun <T> test() {
    val x: Comparator<in Double> = AnyComparator() // OK!
    val y: Comparator<in T> = AnyComparator() // Compilation error
}

第二次分配因错误而失败

Type mismatch. 
Required: kotlin.Comparator<in T>
Found: AnyComparator

现在,如果我正确理解了in修饰符,则表明修饰符T仅被通用类型使用Comparator(它使Comparator变量成为反变量),因此,我应该能够分配任何带有type参数的类型E,这是的基类T基于此,由于类型是Kotlin中每个类的基类,因此我应该能够同时分配AnyComparator给变量x事实证明我做不到,我也不明白为什么。yAny

法比奥·科里尼(Fabio Collini)

它可能看起来很奇怪,但Any不是所有kotlin类的超类,而只是非空类的超类。所有Kotlin类的真正超类是Any?(它也是的超类Any)。

通用型T在你的test函数没有上限,因此它可以是一个可空对象Any?错误是因为Comparator<Any>当您需要时您不能Comparator<Any?>

因此,您可以将定义T上限的示例修复Any

fun <T: Any> test() {
    //...
}

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章