输入与通用参数不匹配

时间:2018-03-15 14:09:48

标签: kotlin

我正在尝试运行以下代码,但是我收到以下编译器错误: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代码有什么问题?

1 个答案:

答案 0 :(得分:4)

您希望Parent<String>成为Parent<Any>的子类型。由于StringAny的子类型,因此您要查找的内容称为协方差。您可以使用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()
}