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分配给变量xy ,因为Any类型是Kotlin中每个类的基类。 事实证明,我不能,我不明白为什么。

这似乎很奇怪,但Any不是所有kotlin类的超类,而只是不可空类。 所有Kotlin类的真正超类是Any? (它也是Any的超类)。

你的test函数中的泛型类型T没有上界,所以它可以是一个可为空的对象Any? 。 这个错误是因为当你需要一个Comparator<Any?>时候你不能使用Comparator<Any> Comparator<Any?>

所以你可以修复你的例子定义T上限为Any

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