Data class extend sealed class


I recently face problems of extending sealed class in data class . The same with this SO link

The solution is OK :

sealed class Message {
    abstract val messageId: String
data class Track(val event: String, override val messageId: String): Message()

But I wonder why Option2 is not supported ?

sealed class Message(val messageId: String)
data class Track(val event: String, messageId: String): Message(messageId)

It seems intuitional (and maybe more ideal) , but pity it’s not supported.

Yes , I know the reason :

(“Data class primary constructor must have only property (val/var) parameters.”)

But I think it should be able to infer it as a superclass’s val parameter and passes.

Just my 2 cents.


It’s compatible.
According to the references:

To declare an explicit supertype, we place the type after a colon in the class header:
If the derived class has a primary constructor, the base class can (and must) be initialized right there, using the parameters of the primary constructor.

In the code, the class was declared as open and the value of the subclass with override.


The open annotation on a class is the opposite of Java’s final: it allows others to inherit from this class. By default, all classes in Kotlin are final, which corresponds to Effective Java, Item 17: Design and document for inheritance or else prohibit it.


Annotation override signals the overriding of base method by inheriting class.

The code would be like this:

sealed class Message(open val messageId: String)
data class Track(val event: String, override val messageId: String) : Message(messageId)


Wow , thanks for great help !