Kotlin的逆差异

Kat*_*ona 6 generics contravariance 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
}
Run Code Online (Sandbox Code Playgroud)

第二个赋值因错误而失败

Type mismatch. 
Required: kotlin.Comparator<in T>
Found: AnyComparator
Run Code Online (Sandbox Code Playgroud)

现在,如果我理解正确,in修饰符指示T仅由泛型类型消耗Comparator(它使逆变),所以我应该能够分配任何Comparator类型参数E,它是基类T.在此基础上,我应该能够分配AnyComparator到两个变量xy,因为类型Any是基类中的每科特林级.事实证明我不能,我不明白为什么.

小智 11

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

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

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

fun <T: Any> test() {
    //...
}
Run Code Online (Sandbox Code Playgroud)