schedule2019-06-27

【Kotlin】This type is final, so it cannot be inherited

This type is final so it cannot be inherited は継承しようとしたクラスが継承できない(final)ですよとの意味。 Kotlinではクラスのデフォルトでfinalであるため、明示的にopenを宣言して継承できるようにする。

Javaよりも厳格になっているようです。

open

継承できない例

// デフォルトでfinal
class Base {
    open fun v() {}
    fun nv() {}
}

class Derived() : Base() { // This type is final, so it cannot be inherited
    override fun v() {}
}

openを付けて継承できように宣言します。

open class Base {
    open fun v() {}
    fun nv() {}
}

class Derived() : Base() { // OK
    override fun v() {}    // 関数はoverride
}

override

上の例のように関数もオーバーライドするためにはopenが必要です。 ちなみに、オーバーライドした関数はopenであり、再度オーバーライドできます。

open class AnotherDerived() : Base() {
  final override fun v() {}
}

finalをつけると再度オーバーライドできません。

参考

Kotlinをはじめて触るので理解を深めるため、エラーのメモを残していく。