密封类在“在Scala编程”中描述,但密封特性都没有。 我在哪里可以找到一个密封的特质更多信息?
我想知道,如果一个密封的特征是一样的密封类? 或者,如果不是,有什么区别? 什么时候使用密封特性(以及何时不)是一个好主意?
密封类在“在Scala编程”中描述,但密封特性都没有。 我在哪里可以找到一个密封的特质更多信息?
我想知道,如果一个密封的特征是一样的密封类? 或者,如果不是,有什么区别? 什么时候使用密封特性(以及何时不)是一个好主意?
甲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
所以,你应该用密封的特性(或密封抽象类),如果可能的亚型的数量是有限的,提前知道。 更多的例子,你可以看看列表和选项实现。
密封的特征是相同的密封类?
至于sealed
云,是的。 它们共享之间的正常差异trait
和class
的,当然。
或者,如果不是,有什么区别?
没有实际意义。
什么时候使用密封特性(以及何时不)是一个好主意?
如果你有一个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]
由于上下文界限(和视图边界)与隐式参数实现。 鉴于特质不能接收参数,你不能这样做。
就个人而言,我更喜欢sealed trait
,除非一些特殊的原因让我用用它sealed abstract class
。 而且我不是在谈论微妙的原因,但在你面前的原因,你不能忽视,如使用类型类。
从日常斯卡拉博客 :
当性状是“密封”的所有它的子类都在同一个文件中声明这使得该组亚类有限,其允许某些编译器检查的。
此外,我觉得有必要指出你的规格:
密封 MODI网络呃适用于类去连接nitions。 密封类可以不直接继承,但如果继承模板是德音响相同的源文件作为继承的类中定义。 然而,密封类的子类可以在任何地方继承。
- M. Odersky的。 Scala语言规范,版本2.8。 在线9月,2013。
简述:
和更多细节的一切有关密封在斯卡拉特质