Kotlin属性不能被子接口覆盖

在下面的精简的例子中,你能解释为什么Kotlin编译器在覆盖一个我们进一步限制它的types的时候会抱怨(编译器消息: 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()) } } 

此外,编译器不会抱怨以下代码片段:

 open class G class H : G() abstract class F { abstract val g: G } class I : F() { override var g : H = H() } 

所以我想有一些接口inheritance,这是不是有类。

你的第一个代码片段无法编译,因为否则这样的奇怪将是可能的:

 val d: D = E() da = object : A {} // Some other sub-type of A, but definitely not a sub-type of B 

这实际上是Java中缺少方法参数协方差的一个变种(没有双关语意思) – 特别是考虑到Kotlin var属性实际上只是getter和setter方法的语法糖。

相反,你的第二个代码片断编译的,因为在这种情况下,协变不是一个问题 – 基类( F )中没有setter被覆盖,所以上面描述的“怪异”是不可能的。