Scala密封特性

特质

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

特质的某些特征

  • 编译器预先知道特征的所有子类型,这有助于通过引发警告来避免错误。

  • 密封特性的继承仅由声明特性的文件内的类允许。在外部文件中,如果类尝试扩展特征,则编译器将抛出错误。

  • 为了防止上述类型的继承,通常将枚举特性与枚举一起使用。