在下面的精简示例中,您能解释为什么Kotlin编译器在覆盖我们进一步限制其类型时会抱怨(编译器消息:n
)
Var-property type is 'B', which is not a type of overriden public abstract var a: A
此外,编译器不会抱怨以下代码段:
interface A
interface B : A {
fun someFunc():Boolean
}
class C : B {
override fun someFunc(): Boolean {
return true
}
}
abstract class D {
abstract var a: A
}
class E : D() {
override var a : B = C()
fun otherFunc() {
println(a.someFunc())
}
}
所以我猜接口继承有一些问题,而不是类。
答案 0 :(得分:4)
您的第一个代码段无法编译,因为否则会出现这样的奇怪现象:
val d: D = E()
d.a = object : A {} // Some other sub-type of A, but definitely not a sub-type of B
这实际上是lack of method parameter covariance in Java的变体(没有双关语) - 特别是考虑到Kotlin var
属性实际上只是getter和setter方法的语法糖。
相反,你的第二个片段会编译,因为在这种情况下,协方差不是问题 - 基类(F
)中没有要重写的setter,所以“奇怪“我上面描述的是不可能的。