什么是密封的特质?什么是密封的特质?(What is a sealed trait?)

2019-06-14 05:13发布

密封类在“在Scala编程”中描述,但密封特性都没有。 我在哪里可以找到一个密封的特质更多信息?

我想知道,如果一个密封的特征是一样的密封类? 或者,如果不是,有什么区别? 什么时候使用密封特性(以及何时不)是一个好主意?

Answer 1:

sealed性状只能在相同的文件中它的声明进行扩展。

他们经常被用来提供另一种enums 。 因为它们可以在一个单一的文件中只延长,编译器知道每一个可能的亚型,可以推理它。

例如与声明:

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

所以,你应该用密封的特性(或密封抽象类),如果可能的亚型的数量是有限的,提前知道。 更多的例子,你可以看看列表和选项实现。



Answer 2:

密封的特征是相同的密封类?

至于sealed云,是的。 它们共享之间的正常差异traitclass的,当然。

或者,如果不是,有什么区别?

没有实际意义。

什么时候使用密封特性(以及何时不)是一个好主意?

如果你有一个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]

由于上下文界限(和视图边界)与隐式参数实现。 鉴于特质不能接收参数,你不能这样做。

就个人而言,我更喜欢sealed trait ,除非一些特殊的原因让我用用它sealed abstract class 。 而且我不是在谈论微妙的原因,但在你面前的原因,你不能忽视,如使用类型类。



Answer 3:

从日常斯卡拉博客 :

当性状是“密封”的所有它的子类都在同一个文件中声明这使得该组亚类有限,其允许某些编译器检查的。



Answer 4:

此外,我觉得有必要指出你的规格:

密封 MODI网络呃适用于类去连接nitions。 密封类可以不直接继承,但如果继承模板是德音响相同的源文件作为继承的类中定义。 然而,密封类的子类可以在任何地方继承。

- M. Odersky的。 Scala语言规范,版本2.8。 在线9月,2013。



Answer 5:

简述:

  • 密封特性只能在同一个文件进行扩展
  • 列出这让编译器很容易知道所有可能的亚型
  • 使用密封性状时可能亚型的数目是有限的,在预先已知
  • 创造一些像Java中枚举的方式
  • 帮助定义代数数据类型(ADT)

和更多细节的一切有关密封在斯卡拉特质



文章来源: What is a sealed trait?