Kotlin中另一个类内的密封类无法编译:无法访问'<init>'它是私有的

Ran*_*ku' 11 class sealed kotlin

如果我使用了文档中的示例,

class SomeActivity : AppCompatActivity() {
    sealed class Expr
    data class Const(val number: Double) : Expr()
    data class Sum(val e1: Expr, val e2: Expr) : Expr()
    object NotANumber : Expr()
}
Run Code Online (Sandbox Code Playgroud)

它没有编译,错误:

Cannot access '<init>', it is private in 'Expr'.
Run Code Online (Sandbox Code Playgroud)

但是,将它移到封闭类之外会使其编译:

sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()

class SomeActivity : AppCompatActivity() {
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?这是预期的行为吗?文档似乎没有提到这一点.

Ale*_*nov 6

是的,事实证明这是预期的行为.根据允许非嵌套子类的提议:

建议:允许顶级子类用于同一文件中的顶级密封类.

对于非顶级密封类,应在其中声明所有子类.所以,对于这样的类没有任何改变.

您想要的方案列为未解决的问题.在https://youtrack.jetbrains.com/issue/KT-13495上有一张票.目前似乎没有人正在研究它.在对提案的讨论中,开发人员说:

好吧,有一些不平凡的实现细节(关于生成合成构造函数),这些细节是针对顶级类解决的,但一般情况下它并不清楚.