为什么编译器建议将密封的子类转换为对象?

dic*_*nus 3 kotlin sealed-class

我不明白为什么编译器建议我将带有子类的密封类转换为对象,让我们看一个例子:

sealed class CallState
class SendReceive : CallState()
class SendOnly:CallState()
Run Code Online (Sandbox Code Playgroud)

对此

sealed class CallState
object SendReceive : CallState()
object SendOnly:CallState()
Run Code Online (Sandbox Code Playgroud)

似乎它阻止我创建一个非状态对象,但我不知道编译器是什么意思。

谢谢你的帮助。

Ens*_*lic 7

编译器说

密封子类没有状态也没有被覆盖的equals,将密封子类转换为对象

由此您可以推断出,如果例如SendReceive 状态,警告就会消失。事实上,如果你将声明更改为

class SendReceive(val i: Int) : CallState()
Run Code Online (Sandbox Code Playgroud)

并因此Int向类添加一个状态,然后警告消失。

解释很简单。如果 的不同实例之间没有区别SendReceive,为什么允许不同的实例?使它成为一个object使得单实例,这是非常合情合理的,当不同的情况下,不以任何方式不同的事情。