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
(它使逆变)消耗,所以我应该能够分配任何具有类型参数E
Comparator
,它是T
的基类。 基于此,我应该能够将AnyComparator
分配给变量x
和y
,因为Any
类型是Kotlin中每个类的基类。 事实证明,我不能,我不明白为什么。
这似乎很奇怪,但Any
不是所有kotlin类的超类,而只是不可空类。 所有Kotlin类的真正超类是Any?
(它也是Any
的超类)。
你的test
函数中的泛型类型T
没有上界,所以它可以是一个可为空的对象Any?
。 这个错误是因为当你需要一个Comparator<Any?>
时候你不能使用Comparator<Any>
Comparator<Any?>
。
所以你可以修复你的例子定义T
上限为Any
:
fun <T: Any> test() { //... }