5

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

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

对此

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

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

谢谢你的帮助。

4

2 回答 2

8

编译器说

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

由此您可以推断,如果例如SendReceive 状态,则警告将消失。实际上,如果您将声明更改为

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

从而Int为类添加一个状态,然后警告消失。

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

于 2020-03-29T12:19:13.037 回答
1

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

SendReceive 是对象,但 SenOnly 将是类。

sealed class CallState {
    object SendReceive : CallState()
    class SendOnly(var totalReceiver:Int) : CallState()
}
于 2020-03-26T18:42:53.417 回答