我正在尝试运行以下代码,但是我收到以下编译器错误:let keys = Object.keys(depth.bids) // ['0.00003061', '0.00003050', etc. ]
for( let key of keys ){
// First pass key=='0.00003061', second pass key=='0.00003050'
}
。
Error:(12, 9) Type mismatch: inferred type is Child but Parent<Any> was expected
但Java的等价物,按预期工作:
abstract class Parent<T> {
abstract fun hi()
}
class Child: Parent<String>() {
override fun hi() {
println("Hi from child")
}
}
fun main(args: Array<String>) {
println("Hello, world!")
test(Child())
}
fun test(parent: Parent<Any>) {
parent.hi()
}
Kotlin代码有什么问题?
答案 0 :(得分:4)
您希望Parent<String>
成为Parent<Any>
的子类型。由于String
是Any
的子类型,因此您要查找的内容称为协方差。您可以使用Parent
关键字标记out
的类型参数,以便采用这种方式:
abstract class Parent<out T> {
abstract fun hi()
}
详细了解official documentation中的差异。
至于为什么Java示例有效,@ Carcigenicate已经在上面的评论中提到你在那里使用原始类型,例如: parent
函数的test
参数根本没有类型参数。如果你真的需要,你可以在Kotlin中实现与star projection类似的东西:
fun test(parent: Parent<*>) {
parent.hi()
}