Kotlin函数参数通用接口类型类型不匹配

问题描述 投票:0回答:1

我有一些逻辑,类似于下面的简单描述。有人可以解释一下为什么执行fB()时显示不匹配吗?

interface SomeInterface<T> {
    fun showMe(aa: T)
    fun getOne(): T
}
interface Jsonizer {
    //something here
}
data class Template (val id: String): Jsonizer
object SomeImpl: SomeInterface<Template> {
    override fun showMe(aa: Template) {
        println("It $aa")
    }

    override fun getOne(): Template {
        return Template("91919191")
    }
}

fun fA() {
     // ERROR:
     // Required: SomeInterface<Jsonizer>
     // Found: SomeImpl
     fB(SomeImpl)
}

fun fB(service: SomeInterface<Jsonizer>) {
     val tmp1 = Template("112233") // assume it's generate by jsonizer
     service.showMe(tmp1)
     val tm2 = service.getOne()
}
kotlin types interface mismatch
1个回答
0
投票

功能fB需要SomeInterface<Jsonizer>或其子类型之一。 SomeImplSomeInterface<Template>的子类型,并且SomeInterface通过其通用参数是invariant,因此,尽管SomeInterface<Template>实现了SomeInterface<Jsonizer>,但Template不是Jsonizer的子类型。

如果要让SomeInterface<Template>SomeInterface<Jsonizer>的子类型,则必须使SomeInterface为协变,但是这是不可能的,因为协变类中的方法不能将该泛型的实例作为参数,并且以showMe作为参数的方法T

© www.soinside.com 2019 - 2024. All rights reserved.