Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class Kotlin can中另一个类内的密封类';无法编译:无法访问'&书信电报;初始化>';这是私人的_Class_Kotlin_Sealed - Fatal编程技术网

Class Kotlin can中另一个类内的密封类';无法编译:无法访问'&书信电报;初始化>';这是私人的

Class Kotlin can中另一个类内的密封类';无法编译:无法访问'&书信电报;初始化>';这是私人的,class,kotlin,sealed,Class,Kotlin,Sealed,如果我用的是 它不编译,错误如下: Cannot access '<init>', it is private in 'Expr'. 为什么会这样?这是故意的行为吗?文档中似乎没有提到这一点。来自文档: 密封类本身是抽象的,不能实例化 直接,可以有抽象成员 密封类不允许有非私有构造函数(它们的 构造函数是私有的(默认情况下) 我想您应该使用以下示例: fun main(args: Array<String>) { val c = Const(5.0) v

如果我用的是

它不编译,错误如下:

Cannot access '<init>', it is private in 'Expr'.

为什么会这样?这是故意的行为吗?文档中似乎没有提到这一点。

来自文档:

密封类本身是抽象的,不能实例化 直接,可以有抽象成员

密封类不允许有非私有构造函数(它们的 构造函数是私有的(默认情况下)

我想您应该使用以下示例:

fun main(args: Array<String>) {
    val c = Const(5.0)
    val s = Sum(Const(1.0), Const(3.0))

    println(eval(c))
    println(eval(s))
}

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

fun eval(expr: Expr): Double = when(expr) {
    is Const -> expr.number
    is Sum -> eval(expr.e1) + eval(expr.e2)
    NotANumber -> Double.NaN
    // the `else` clause is not required because we've covered all the cases
}
fun main(args:Array){
val c=常数(5.0)
val s=总和(常数(1.0),常数(3.0))
println(eval(c))
println(评估)
}
密封类出口
数据类常量(值编号:Double):Expr()
数据类和(val e1:Expr,val e2:Expr):Expr()
对象编号:Expr()
乐趣评估(expr:expr):双重=何时(expr){
是常量->表达式编号
is Sum->eval(表达式e1)+eval(表达式e2)
NotANumber->Double.NaN
//“else”条款不是必需的,因为我们已经涵盖了所有的案例
}

在Kotlin 1.0中,密封功能相当有限。对于 例如,所有子类都必须嵌套,并且子类不能成为 数据类(本章后面将介绍数据类)。Kotlin 1.1放松 限制,并允许您在中的任何位置定义密封类的子类 相同的文件。 在给定的示例中,到目前为止是不允许的。在以后的版本中,他们可能会放宽这一限制。 但是,您可以这样做:

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

是的,事实证明这是故意的行为。根据:

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

对于非顶级密封类,所有子类都应该在其中声明。因此,对于这样的类,没有任何变化

您想要的场景列为开放式问题。这里有一张票。目前似乎没有人在做这件事。在对提案的讨论中,开发商表示:


有趣的是,如果不允许非私有构造函数,那么这个
Const(…):Expr()
是如何工作的。在这里,您使用Const的构造函数。这个限制不适用于扩展密封类的类。是的。对于顶级密封类,编译器将创建内部使用的公共构造函数,但对于嵌套类则不创建。@Maxim Wait,public?不受保护?我想这只是编译器的限制。从技术角度看,我不明白为什么不能嵌套密封类。在我看来,密封类更像是一个bug,而不是一个限制。如果出于某种原因,至少应该修复消息。毕竟不是bug。
fun main(args: Array<String>) {
    val c = Const(5.0)
    val s = Sum(Const(1.0), Const(3.0))

    println(eval(c))
    println(eval(s))
}

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

fun eval(expr: Expr): Double = when(expr) {
    is Const -> expr.number
    is Sum -> eval(expr.e1) + eval(expr.e2)
    NotANumber -> Double.NaN
    // the `else` clause is not required because we've covered all the cases
}
`class SomeActivity {
    sealed class Expr {
        data class Const(val number: Double) : Expr()
        data class Sum(val e1: Expr, val e2: Expr) : Expr()
        object NotANumber : Expr()
    }
}`