我不明白为什么编译器建议我将带有子类的密封类转换为对象,让我们看看一个例子:
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()
}