Scala中的密封特性用于在Scala应用程序中进行详尽的检查。由于进行了详尽的检查,该程序允许在单个文件中声明密封特征的成员。
这可以通过预先提供特征的所有可能成员的列表来帮助编译器。这减少了我们代码中出错的机会。
让我们看一下代码块,这里有一个特征,所有成员都用它声明。
sealed trait trait1{}
class class1 extends trait1
class class2 extends trait1
class class3 extends trait1现在,由于我们具有密封的特征,因此将使用详尽的检查,这将要求包括该特征的所有子类型,否则将发出警告。
示例
sealed trait royalEnfield
{
val speed= 110;
}
class bullet extends royalEnfield
{
override val speed = 125;
}
class thunderbird extends royalEnfield
{
override val speed = 137;
}
class continental extends royalEnfield
{
override val speed = 152;
}
object myObject
{
def main(args: Array[String])
{
val bullet350 = new bullet;
val thbd350 = new thunderbird;
val gt = new continental;
println(topSpeed(bullet350));
println(topSpeed(thbd350));
println(topSpeed(gt));
}
def topSpeed(Article: royalEnfield): Int = Article match
{
case bullet350: bullet =>bullet350.speed;
case thbd350: thunderbird =>thbd350.speed;
case gt: continental =>gt.speed;
}
}输出结果
125 137 152
编译器预先知道特征的所有子类型,这有助于通过引发警告来避免错误。
密封特性的继承仅由声明特性的文件内的类允许。在外部文件中,如果类尝试扩展特征,则编译器将抛出错误。
为了防止上述类型的继承,通常将枚举特性与枚举一起使用。