我有一些逻辑,类似于下面的简单描述。有人可以解释一下为什么执行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
通过其通用参数是invariant,因此,尽管SomeInterface<Template>
实现了SomeInterface<Jsonizer>
,但Template
不是Jsonizer
的子类型。
如果要让SomeInterface<Template>
为SomeInterface<Jsonizer>
的子类型,则必须使SomeInterface
为协变,但是这是不可能的,因为协变类中的方法不能将该泛型的实例作为参数,并且以showMe
作为参数的方法T
。