本文概述
Scala trait用法:封装提供详尽检查为我们的应用程序。穷举检查允许检查是否必须在与源文件相同的文件中声明密封特征的所有成员。这意味着必须包括的特征的所有可能的已知成员都已被编译器预先知道。因此, 这给我们带来了防止代码出错的优势。
句法 :
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
}
让我们来看看以下程序在文件另存为语言标量:-
范例:
Scala trait用法示例
// 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
Scala trait用法的一些重点
- 特质的子类型是预先已知的-如果在模式匹配中不包含任何密封的C类子类型, 则会给我们警告。这样的警告告诉你, 由于未处理某些可能的模式, 因此代码可能会产生匹配错误异常。该警告指出了运行时错误的潜在根源, 因此通常在正确设置程序方面是受欢迎的帮助。
- 密封特征只能在与子类型相同的源文件中扩展, 在上面的示例中, 我们还有另一个类python在另一个scala文件中。导入特征极客从语言标量我们将收到如下错误消息。
illegal inheritance from sealed trait bag
import geeks
class python extends geeks{
val article="python article";
}
- 密封类也主要用于枚举–防止非法继承并使用所有子类型, 以避免详尽的匹配警告。
范例:
Scala
// 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 obj 1
{
// Main method
def main(args : Array[String])
{
val card 1 = HEART
val card 2 = CLUB
val card 3 = SPADE
val card 4 = DIAMOND
println(checkcard(card 1 ))
println(checkcard(card 2 ))
println(checkcard(card 3 ))
println(checkcard(card 4 ))
}
// 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
以上就是Scala trait用法的详细指南