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