什么是一个封闭的特质?
什么是一个封闭的特质?
封闭类在《Scala编程》中有描述,但封闭特质没有。我在哪里可以找到有关封闭特质的更多信息?
我想知道,封闭特质是否与封闭类相同?如果不同,有什么区别?什么时候使用封闭特质是个好主意(什么时候不是)?
sealed trait和sealed class是一样的吗?
就sealed
而言,是的。当然,它们之间有普通的trait
和class
之间的区别。
如果不是的话,有什么区别?
无关紧要。
何时使用sealed trait是一个好主意(何时不是)?
如果你有一个sealed class X
,那么你必须检查X
以及任何子类。sealed abstract class X
或sealed trait X
则不是这样的。因此你可以用sealed abstract class X
,但是这相对于只使用trait
来说更加冗长,而且优势很小。
使用abstract class
而不是trait
的主要优势在于它可以接收参数。这个优势在使用类型类时特别重要。例如,假设你想构建一棵排序树。你可以写出这样的代码:
sealed abstract class Tree[T : Ordering]
但你无法写出下面的代码:
sealed trait Tree[T : Ordering]
因为环境界(和视图界限)是通过隐式参数实现的。鉴于trait
不能接收参数,你做不到那样。
个人而言,我更喜欢使用sealed trait
,除非有一些特别的原因让我使用sealed abstract class
。我说的不是细微的原因,而是你无法忽视的明显原因,例如使用类型类。
sealed
trait(密封的特征)只能在它的声明文件中被扩展。
它们通常被用来提供一个替代 enum
的方案。因为它们只能在单个文件中被扩展,编译器可以知道每一个可能的子类型并对此进行推理。
例如,用以下声明:
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") | }:12: warning: match is not exhaustive! missing combination Yes
因此,如果可能的子类型的数量是有限的并且事先已知,应该使用密封的特征(或密封的抽象类)。更多示例可以查看list和option的实现。