Kotlin属性不能用子接口覆盖

时间:2017-12-04 23:15:03

标签: inheritance interface kotlin

在下面的精简示例中,您能解释为什么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())
    }
}

所以我猜接口继承有一些问题,而不是类。

1 个答案:

答案 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,所以“奇怪“我上面描述的是不可能的。