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)