为什么编译器建议将 sealed sub-class 转换为对象?

Why the compiler suggest convert sealed sub-class to object?

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

sealed class CallState
class SendReceive : CallState()
class SendOnly:CallState()

至此

sealed class CallState
object SendReceive : CallState()
object SendOnly:CallState()

好像是在阻止我创建非状态对象,但我不知道编译器是什么意思。

感谢您的帮助。

sealed classes 类似于 java 中的枚举,但它允许保持状态。 如果子class不保持状态,它可以只是一个对象。

SendReceive 是对象,但 SenOnly 将是 class。

sealed class CallState {
    object SendReceive : CallState()
    class SendOnly(var totalReceiver:Int) : CallState()
}

编译器说

Sealed sub-class has no state and no overridden equals, convert sealed sub-class to object

从这里你可以推断出,如果SendReceive had 状态,警告会消失。实际上,如果您将声明更改为

class SendReceive(val i: Int) : CallState()

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

解释很简单。如果 SendReceive 的不同实例之间没有区别,为什么允许不同的实例?使其成为 object 使其成为单实例,当不同的实例在任何方面都没有不同时,这非常有意义。