当前位置: 首页 > 知识库问答 >
问题:

从Kotlin中的密封类扩展data类

盖昊东
2023-03-14
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打开超类型属性来进行折衷。

  • 共有1个答案

    巢宏富
    2023-03-14

    选项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中的密封类来进行这种类型的操作?密封类是做多态的好选择吗?