[英]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>
或其子类型之一。 SomeImpl
是SomeInterface<Template>
的子类型,而SomeInterface
的泛型参数是不变的,所以SomeInterface<Template>
不是SomeInterface<Jsonizer>
的子类型,尽管Template
实现了Jsonizer
。
如果您希望SomeInterface<Template>
成为SomeInterface<Jsonizer>
的子类型, SomeInterface<Jsonizer>
必须使SomeInterface
协变,但这是不可能的,因为协变类中的方法不能将该泛型类型的实例作为参数,而您有一个方法showMe
将T
作为参数。
所有这一切都意味着您应该重新设计您的类架构。 例如,您可以将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.