“Scala 编程”中描述了密封类,但没有描述密封特征。 我在哪里可以找到有关密封特征的更多信息?
我想知道,密封特征与密封类是否相同? 或者,如果不是,有什么区别? 什么时候使用密封特征是个好主意(什么时候不是)?
最佳答案
sealed
特征只能在与其声明相同的文件中进行扩展。
它们通常用于提供枚举
的替代方案。由于它们只能在单个文件中扩展,因此编译器知道每种可能的子类型并可以对其进行推理。
例如声明:
sealed trait Answer
case object Yes extends Answer
case object No extends Answer
如果匹配不详尽,编译器将发出警告:
scala> val x: Answer = Yes
x: Answer = Yes
scala> x match {
| case No => println("No")
| }
<console>:12: warning: match is not exhaustive!
missing combination Yes
因此,如果可能的子类型数量有限且提前已知,则应使用密封特征(或密封抽象类)。有关更多示例,您可以查看 list和 option实现。
关于scala - 什么是密封特质?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11203268/