我从来没有真正理解 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
分配类型参数 E
,它是 T
的基类。基于此,我应该能够将 AnyComparator
分配给两个变量 x
和 y
,因为类型 Any
是 Kotlin 中每个类的基类。事实证明我不能,我不明白为什么。
最佳答案
这可能看起来很奇怪,但是 Any
不是所有 kotlin 类的父类(super class),而只是不可为空的类。所有 Kotlin 类的真正父类(super class)是 Any?
(它也是 Any
的父类(super class))。
泛型 T
在您的test
函数没有上限,所以它可以是一个可以为空的对象 Any?
.错误是因为你不能 Comparator<Any>
当您需要 Comparator<Any?>
.
因此您可以修复定义 T
的示例上限为 Any
:
fun <T: Any> test() {
//...
}
关于generics - Kotlin 中的逆变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44861928/