web-dev-qa-db-ja.com

Kotlin:内部クラスのコンストラクターは、包含クラスのレシーバーでのみ呼び出すことができます

Kotlinで内部クラスを試してみたところ、このエラーに遭遇しましたが、完全には理解できませんでした。私はドキュメンテーションを見てみました here が、外部クラスが内部クラスコンストラクターにアクセスする方法についてまったく指示がありませんでした

class OuterClass {

  fun someFun(): InnerClassSuper {
    return InnerClassX("Hello") //Error: Constructor of inner class InnerClassX can be called only with receiver of containing class
  }

  sealed class InnerClassSuper {

    inner class InnerClassX(val x: String): InnerClassSuper()

  }
}

誰かがエラーを説明し、それを修正する方法を指示してくれれば幸いです。ありがとう。

12
Pravin Sonawane

あなたのコードは基本的にInnerClassXInnerClassSuperではなくOuterClassの内部クラスであることを意味するので、エラーはInnerClasssSuperのレシーバーオブジェクトを提供する必要があることを意味しますInnerClassXの構築。

この時点で、Kotlinはinner sealedクラスまたはsealedクラスの派生クラスは、別のクラスのinnerクラスとして。

ただし、abstractクラスから派生したsealedクラスを作成し、OuterClass内から継承することができます。

sealed class SealedClassSuper {
    abstract class SealedClassChild(val x: String): SealedClassSuper()
}

class OuterClass {
    inner class InnerClassX(x: String) : SealedClassSuper.SealedClassChild(x)

    fun someFun(): SealedClassSuper {
        return InnerClassX("Hello")
    }
}
8
hotkey