scala - 什么是密封特质?

标签 scala sealed traits

“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

因此,如果可能的子类型数量有限且提前已知,则应使用密封特征(或密封抽象类)。有关更多示例,您可以查看 listoption实现。

关于scala - 什么是密封特质?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11203268/

相关文章:

scala @switch 注释,它对生成的字节码有什么影响吗?

scala - 找不到参数 marshaller : spray. httpx.marshalling.ToResponseMarshaller 的隐式值

c++ - C++ 中的 'ref' 和 'sealed' 关键字是什么?

angular - Angular HttpClient 未正确反序列化 Scala 类

function - Scala 方法 = trait { ... } 含义

scala - 将一系列函数应用于 value 并获得最终结果

scala - Spark 中的每文档字数统计

c# - 抽象类的密封属性

c# - 当 "sealed"是可选的时,C# 中 "virtual"的用途是什么?

rust - 无法在 Rust 中转换为超特征