fun operate(m: Message) {
use(m.messageId)
}
数据类可以扩展密封类,但不是,我不确定它们如何/是否能够接受“supertype”密封类所需的参数。
>
从密封类扩展常规类可以很好地编译。
sealed class Message(val messageId: String)
class Track(val event: String, messageId: String): Message(messageId)
但是,将其更改为数据类并不编译(“数据类主构造函数必须只具有属性(val/var)参数”)。
sealed class Message(val messageId: String)
data class Track(val event: String, messageId: String): Message(messageId)
sealed class Message(val messageId: String)
data class Track(val event: String, val messageId: String): Message(messageId)
sealed class Message(open val messageId: String)
data class Track(val event: String, override val messageId: String): Message(messageId)
否则,我的选择似乎是使用选项1处理我自己的数据类功能(copy、hashcode、equals等),或者通过使用选项4打开超类型属性来进行折衷。
选项3和4将导致类保留messageID
两次。一次在新类中,一次在其超类中。
解决方法是在超类中声明但不定义变量:
sealed class Message {
abstract val messageId: String
}
data class Track(val event: String, override val messageId: String): Message()
这将使messageId在message
上可用,但将存储委托给实现它的任何东西。
下面的代码在无法通过条件颜色时编译。深色和彩色。浅色,因为这两个类是抽象的。 我错过什么了吗?
数据类似乎是Java中老式POJO的替代品。这些类将允许继承是可以预期的,但我看不到扩展数据类的方便方法。我需要的是这样的东西:
主要内容:数据类,密封类数据类 Kotlin 可以创建一个只包含数据的类,关键字为 data: 编译器会自动的从主构造函数中根据所有声明的属性提取以下函数: / 格式如 对应于属性,按声明顺序排列 函数 如果这些函数在类中已经被明确定义了,或者从超类中继承而来,就不再会生成。 为了保证生成代码的一致性以及有意义,数据类需要满足以下条件: 主构造函数至少包含一个参数。 所有的主构造函数的参数必须标识为 或者 ; 数据类不可
数据类 Kotlin 可以创建一个只包含数据的类,关键字为 data: data class User(val name: String, val age: Int) 编译器会自动的从主构造函数中根据所有声明的属性提取以下函数: equals() / hashCode() toString() 格式如 "User(name=John, age=42)" componentN() functio
当数据类扩展包含非抽象open val属性的密封类时,生成的子数据类包含与父类的私有字段重复的私有字段。 的输出:
我有下面的Kotlin代码。一个名为的密封类和两个对象类和继承自密封类。我在is Cat情况下的子句中得到这个错误。 为什么会给出这个错误?如何使用Kotlin中的密封类来进行这种类型的操作?密封类是做多态的好选择吗?