我从来没有真正理解过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
(它使Comparator
变量成为反变量),因此,我应该能够分配任何带有type参数的类型E
,这是的基类T
。基于此,由于类型是Kotlin中每个类的基类,因此我应该能够同时分配AnyComparator
给变量x
和。事实证明我做不到,我也不明白为什么。y
Any
它可能看起来很奇怪,但Any
不是所有kotlin类的超类,而只是非空类的超类。所有Kotlin类的真正超类是Any?
(它也是的超类Any
)。
通用型T
在你的test
函数没有上限,因此它可以是一个可空对象Any?
。错误是因为Comparator<Any>
当您需要时您不能Comparator<Any?>
。
因此,您可以将定义T
上限的示例修复为Any
:
fun <T: Any> test() {
//...
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句