Котлин: конструктор внутреннего класса можно вызывать только с получателем содержащего класса - PullRequest
0 голосов
/ 15 мая 2018

Я пробовал внутренние классы в Котлине и столкнулся с этой ошибкой, но не совсем ее понял.Я попытался взглянуть на документацию здесь , но не совсем понял, как внешние классы могут обращаться к внутренним конструкторам классов

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()

  }
}

Буду признателен, если кто-то объяснит ошибку и направиткак это исправить.Спасибо.

1 Ответ

0 голосов
/ 15 мая 2018

Ваш код в основном означает, что InnerClassX является внутренним классом InnerClassSuper, а не 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")
    }
}
...