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到两个变量x和y,因为类型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)