什么是一个封闭的特质?

14 浏览
0 Comments

什么是一个封闭的特质?

封闭类在《Scala编程》中有描述,但封闭特质没有。我在哪里可以找到有关封闭特质的更多信息?

我想知道,封闭特质是否与封闭类相同?如果不同,有什么区别?什么时候使用封闭特质是个好主意(什么时候不是)?

admin 更改状态以发布 2023年5月23日
0
0 Comments

sealed trait和sealed class是一样的吗?

sealed而言,是的。当然,它们之间有普通的traitclass之间的区别。

如果不是的话,有什么区别?

无关紧要。

何时使用sealed trait是一个好主意(何时不是)?

如果你有一个sealed class X,那么你必须检查X以及任何子类。sealed abstract class Xsealed 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。我说的不是细微的原因,而是你无法忽视的明显原因,例如使用类型类。

0
0 Comments

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

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

0