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



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

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

到这个

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

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

谢谢你的帮助。

编译器说

密封的子类没有状态,也没有重写的equals,convert密封子类到对象

由此可以推断,如果例如SendReceive具有状态,则警告将消失。事实上,如果你把申报改为

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

并且因此将Int状态添加到类,则警告消失。

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

密封类类似于java中的enum,但它允许保持状态。如果一个子类不保持状态,它可能只是一个对象。

SendReceive是对象,但SenOnly将是类。

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

最新更新