草庐IT

Kotlin:密封类不能 "contain"数据类?为什么?

好的,既然Kotlin正式出局了,我又开始玩它了,我很困惑,我需要在sealed和data的优势之间做出选择>但不知何故不能两者兼得。例如,这对我来说似乎有意义,但无法编译:sealedclassExpr{dataclassConst(valnumber:Double):Expr()dataclassSum(valexpr1:Expr,valexpr2:Expr):Expr()}因为数据类不能扩展其他类。我有什么遗漏吗? 最佳答案 在进入Beta状态前不久,Kotlin团队决定对data类的使用添加某些限制(seethispost)

kotlin - Kotlin 中的密封类是什么?

我是Kotlin的初学者,最近阅读了SealedClasses.但是从文档中我真正得到的唯一想法是它们是存在的。文档指出,它们“代表受限的类层次结构”。除此之外,我发现他们是具有超能力的枚举。这两个方面其实都不清楚。那么你能帮我解决以下问题吗:什么是密封类以及使用它们的惯用方式是什么?这样的概念是否存在于Python、Groovy或C#等其他语言中?更新:我仔细检查了这个blogpost仍然无法理解这个概念。如帖子所述BenefitThefeatureallowsustodefineclasshierarchiesthatarerestrictedintheirtypes,i.e.su

kotlin - Kotlin 中的密封类是什么?

我是Kotlin的初学者,最近阅读了SealedClasses.但是从文档中我真正得到的唯一想法是它们是存在的。文档指出,它们“代表受限的类层次结构”。除此之外,我发现他们是具有超能力的枚举。这两个方面其实都不清楚。那么你能帮我解决以下问题吗:什么是密封类以及使用它们的惯用方式是什么?这样的概念是否存在于Python、Groovy或C#等其他语言中?更新:我仔细检查了这个blogpost仍然无法理解这个概念。如帖子所述BenefitThefeatureallowsustodefineclasshierarchiesthatarerestrictedintheirtypes,i.e.su

enums - 使用关联类型时密封类与枚举

我想基于Int创建一个颜色对象.我可以使用sealedclass获得相同的结果和enum并且想知道一个是否比另一个更好。使用sealedclass:sealedclassSealedColor(valvalue:Int){classRed:SealedColor(0)classGreen:SealedColor(1)classBlue:SealedColor(2)companionobject{valmap=hashMapOf(0toRed(),1toGreen(),2toBlue())}}valsealedColor:SealedColor=SealedColor.map[0]!!w

enums - 使用关联类型时密封类与枚举

我想基于Int创建一个颜色对象.我可以使用sealedclass获得相同的结果和enum并且想知道一个是否比另一个更好。使用sealedclass:sealedclassSealedColor(valvalue:Int){classRed:SealedColor(0)classGreen:SealedColor(1)classBlue:SealedColor(2)companionobject{valmap=hashMapOf(0toRed(),1toGreen(),2toBlue())}}valsealedColor:SealedColor=SealedColor.map[0]!!w

kotlin - 如何获取给定密封类的所有子类?

最近我们将其中一个枚举类升级为密封类将对象作为子类,这样我们就可以创建另一层抽象来简化代码。但是,我们不能再通过Enum.values()函数获得所有可能的子类,这很糟糕,因为我们严重依赖该功能。有没有办法通过反射或任何其他工具来检索这些信息?PS:手动将它们添加到数组中是NotAcceptable。目前有45个,并且计划增加更多。这就是我们的密封类的样子:sealedclassStateobjectStateA:State()objectStateB:State()objectStateC:State()....//42more如果有一个values集合,它将是这个形状:valVAL

kotlin - 如何获取给定密封类的所有子类?

最近我们将其中一个枚举类升级为密封类将对象作为子类,这样我们就可以创建另一层抽象来简化代码。但是,我们不能再通过Enum.values()函数获得所有可能的子类,这很糟糕,因为我们严重依赖该功能。有没有办法通过反射或任何其他工具来检索这些信息?PS:手动将它们添加到数组中是NotAcceptable。目前有45个,并且计划增加更多。这就是我们的密封类的样子:sealedclassStateobjectStateA:State()objectStateB:State()objectStateC:State()....//42more如果有一个values集合,它将是这个形状:valVAL

kotlin - 从 Kotlin 中的密封类扩展数据类

我有一组共享一些公共(public)字段的数据类,所以理想情况下,我想在父类(superclass)型中声明它们(本例中为Message),并且能够编写在需要访问时对父类(superclass)型进行操作的函数到这些公共(public)字段(本例中为messageId)。funoperate(m:Message){use(m.messageId)}我试图通过从一个密封类扩展我的数据类来实现这一点。数据类可以扩展密封类,但我不确定它们如何/是否可以接受“父类(superclass)型”密封类所需的参数。从一个密封的类中扩展一个普通的类编译就好了。sealedclassMessage(va

kotlin - 从 Kotlin 中的密封类扩展数据类

我有一组共享一些公共(public)字段的数据类,所以理想情况下,我想在父类(superclass)型中声明它们(本例中为Message),并且能够编写在需要访问时对父类(superclass)型进行操作的函数到这些公共(public)字段(本例中为messageId)。funoperate(m:Message){use(m.messageId)}我试图通过从一个密封类扩展我的数据类来实现这一点。数据类可以扩展密封类,但我不确定它们如何/是否可以接受“父类(superclass)型”密封类所需的参数。从一个密封的类中扩展一个普通的类编译就好了。sealedclassMessage(va

java - 密封类是否在 Java 中强制执行,如果是,如何执行?

可以在Scala中定义sealed类,它们基本上是final除非子类发生在同一个文件中。JVM似乎不允许final类字节码和它的子类。考虑到字节码中没有源文件的“概念”,这个限制是如何实现的?因此,javac如何防止Scalasealed类在Java中被子类化? 最佳答案 该限制在编译时由scalac对Scala源代码强制执行。生成的二进制类定义没有设置JVM最终标志,因此,正如您现在可能已经猜到的那样,当针对Scala二进制文件编译Java源代码时,javac不会强制执行密封限制。 关