Scala Sealed 特质
Sealed 为我们的应用程序提供了详尽的检查 。穷举检查允许检查一个密封特质的所有成员必须在与源文件相同的文件中声明。这意味着编译器事先知道所有必须包含的特性的可能成员。因此,这给了我们一个优势,可以防止我们的代码中出现错误。
语法:
sealed trait X
class A extends X
class B extends X
class C extends X
穷举检查在scala中主要用于类型/模式匹配。假设我们有一个密封的特质X和扩展特质X的类。在匹配特质X的子类型时,我们必须确保必须包含所有已知的子类型。下面的方法会给我们一个警告。虽然我们会得到正确的输出,但这可能会导致我们的应用程序在运行时意外崩溃。
Warning: match may not be exhaustive
def obj(item: X) = item match {
case A => //
case B => //
}
正确的实现方式是–
def obj(item: X) = item match{
case A => //
case B => //
case C => //
or
case _ => //for covering all the remaining cases
}
让我们来看看下面的程序,文件保存为 language.scala :
例子:
// Scala Program that illustrates sealed trait
// language.scala
sealed trait Geeks
{
val article="not done"
}
// Class extends trait
class Scala extends Geeks
{
override val article = "scala article"
}
// Class extends trait
class Java extends Geeks
{
override val article = "java article"
}
// Class extends trait
class Csharp extends Geeks
{
override val article = "csharp article"
}
// Creating object
object GFG
{
// Main method
def main(args: Array[String])
{
val s = new Scala
val j = new Java
val c = new Csharp
println(checkArticle(s))
println(checkArticle(j))
println(checkArticle(c))
}
// Defined function
def checkArticle(Article: Geeks): String = Article match
{
case s: Scala => s.article
case j: Java => j.article
case c: Csharp => c.article
//exclusion of <strong>line 45</strong> would lead to warning
}
}
输出:
scala article
java article
csharp article
一些重要的观点
- 特质的子类型是事先知道的– 在模式匹配中不包括密封类C的任何子类型会给我们警告。这样的警告告诉你,你的代码有可能产生一个匹配错误异常,因为一些可能的模式没有被处理。这个警告指出了一个潜在的运行时故障源,所以它通常是一个受欢迎的帮助,让你的程序变得正确。
-
封闭的traits只能在同一源文件中与子类型进行扩展– 在上面的例子中,我们在另一个scala文件中有另一个类 python 。从 language.scala 导入trait geeks ,我们会得到如下的错误信息。
illegal inheritance from sealed trait bag
import geeks
class python extends geeks{
val article="python article";
}
- 密封类也多 用于 枚举 中 – 防止非法继承和使用所有的子类型,以避免详尽的匹配警告。
例子
// Scala Program that illustrates sealed trait
// By using Enumeration
sealed trait card extends Enumeration
// Class extends trait
case object CLUB extends card
// Class extends trait
case object HEART extends card
// Class extends trait
case object DIAMOND extends card
// Class extends trait
case object SPADE extends card
// Creating object
object obj1
{
// Main method
def main(args: Array[String])
{
val card1 = HEART
val card2 = CLUB
val card3 = SPADE
val card4 = DIAMOND
println(checkcard(card1))
println(checkcard(card2))
println(checkcard(card3))
println(checkcard(card4))
}
// Defined function
def checkcard(x: card): String = x match
{
case HEART =>"heart"
case CLUB =>"club"
case SPADE =>"spade"
case DIAMOND =>"diamond"
}
}
输出:
heart
club
spade
diamond
极客教程