sealed trait Option[+A]
final case class Some[+A] extends Option[A]
object None extends Option[Nothing]
因为 Option[A] 是密封的,所以它不能被其他开发者扩展 - 这样做会改变它的含义 .
Some[A] 是最终的,因为它无法延长,期间 .
另外一个好处是,如果特征是密封的,编译器可以警告您,如果您的模式匹配不够详尽,因为它知道 Option 仅限于 Some 和 None .
opt match {
case Some(a) => "hello"
}
警告:匹配可能并非详尽无遗 . 它将在以下输入上失败:无
82
sealed 类(或特征)仍然可以在同一个源文件中继承(其中 final 类根本不能继承) .
如果要限制基类的子类数,请使用 sealed (请参阅"Algebraic Data Type") .
作为这种限制的一个非常实际的好处,编译器现在可以警告你关于非执行模式匹配:
sealed trait Duo
case class One(i:Int) extends Duo
case class Two(i:Int, j:Int) extends Duo
def test(d:Duo) {
match {
case One(x) => println(x) // warning since you are not matching Two
}
}
2 回答
final
类无法扩展,期限 .sealed
特征只能在与声明的源文件相同的源文件中扩展 . 这对于创建ADT(代数数据类型)很有用 . ADT由其派生类型的总和定义 .例如 . :
Option[A]
由Some[A]
None
定义 .A
List[A]
由::
Nil
定义 .因为
Option[A]
是密封的,所以它不能被其他开发者扩展 - 这样做会改变它的含义 .Some[A]
是最终的,因为它无法延长,期间 .另外一个好处是,如果特征是密封的,编译器可以警告您,如果您的模式匹配不够详尽,因为它知道
Option
仅限于Some
和None
.sealed
类(或特征)仍然可以在同一个源文件中继承(其中final
类根本不能继承) .如果要限制基类的子类数,请使用
sealed
(请参阅"Algebraic Data Type") .作为这种限制的一个非常实际的好处,编译器现在可以警告你关于非执行模式匹配: