繁体   English   中英

Kotlin 函数参数泛型接口类型类型不匹配

[英]Kotlin function parameter generic interfacte type type mismatch

我有一些逻辑,类似于下面的 simpyfied。 有人能解释一下为什么执行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()
}

函数fB需要SomeInterface<Jsonizer>或其子类型之一。 SomeImplSomeInterface<Template>的子类型,而SomeInterface的泛型参数是不变的,所以SomeInterface<Template>不是SomeInterface<Jsonizer>的子类型,尽管Template实现了Jsonizer

如果您希望SomeInterface<Template>成为SomeInterface<Jsonizer>的子类型, SomeInterface<Jsonizer>必须使SomeInterface协变,但这是不可能的,因为协变类中的方法不能将该泛型类型的实例作为参数,而您有一个方法showMeT作为参数。

所有这一切都意味着您应该重新设计您的类架构。 例如,您可以将SomeInterface分为消费者和生产者接口 - 消费者使用showMe方法,生产者使用getOne方法,因此您可以在代码中尝试时使生产者协变和消费者逆变,并为Jsonizer具体子类型创建不同的实现。

  • SomeImpl实现SomeInterface<Template>
  • fun fB需要SomeInterface<Jsonizer>

如果你想让fB工作,你可以在函数中添加类型

fun <T> fB(service: SomeInterface<T>)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM