Scala 下限
类型边界 基本上是对参数或变量的一种限制。通过使用这些类型界线,我们可以为变量设置限制。这些边界有助于将我们的代码放到现实世界的例子中。我们需要对现实生活中的每一个因素施加一定的限制和约束,这就是Scala中类型界线的作用。
主要有2种类型界线。
- 上层类型边界(Upper type bound
- 下限类型界线
在本节中我们将更多地关注下限类型界线。 下限类型界线 用于声明另一个类型的超类型。一个下界用 > : **表示 **。 任何下限语句都可以写成 ‘ [ **T >:S] **’ 。这里T是一个类型参数,S是一个类型。上面的下限语句意味着类型参数T必须与S相同或者是S的超类型。
让我们了解一下超类型,假设我们写S>:T,那么这个下限语句中的T总是等于S或者小于S,这意味着在这种情况下T是被约束的。所以我们可以说T是S的一个超类型。
语法
[T >: Demo[T]]
在上述案例中,我们定义了一个从类型参数T到类型Demo的下限。而T必须是Demo或者是Demo类型的超类型。
让我们再举一个例子
如果我以一定的格式声明所有的类,如下所示。
trait Food
class eatables extends Food
class drinks extends Food
class fruits extends eatables
class vegetables extends eatables
class cold_drinks extends drinks
class hot_drinks extends drinks
class position[A](val place:A)
现在所有的类以及子类都已经用上述语句声明了。因此,如果我们考虑语句position[A],这里position是泛指,A是抽象类型。这可以进一步简化,position[A]表示传递给place的值必须是A类型的。这意味着如果我给出position[fruits]的命令,那么它将被创建为一个Fruits的实例。所以为了验证这一点,我们将看到一个例子。
new position[fruits](new fruits)
new position[fruits](new drinks)
new position[eatables](new vegetables)
在上面的例子中,我们会注意到第一条语句会被编译,但第二条语句会显示错误,因为水果和饮料不属于同一类型。另一方面,第三条语句将被编译,因为蔬菜是可食性的子类型。现在在上面给出的语句中使用一些下限命令。
class position[A >: fruits](val place=A)
通过这句话我们可以说,我们可以定位水果的任何超类型,也就是eatables和Food。所以,通过这一点,我们可以肯定地看到,如果在任何现实世界的例子中使用一些逻辑,Scala的下限可以非常有用和采用。因此,我们可以在我们的变量上添加所有现实生活中的限制和约束,我们在编码语言中使用这些变量。
例子
// Scala Program To Demonstrate Scala Lower Bound
class GeeksforGeeks
class Author extends GeeksforGeeks
class Geeks extends GeeksforGeeks
class ComputerSciencePortal
{
// Declaration of Lower bound
def display [T >: Geeks](d : T)
{
println(d)
}
}
// Object created
object ScalaUpperBounds
{
// Driver code
def main(args: Array[String])
{
val geeksforgeeks = new GeeksforGeeks
val author = new Author
val geeks = new Geeks
val computerscienceportal = new ComputerSciencePortal
computerscienceportal.display(geeksforgeeks)
computerscienceportal.display(geeks)
computerscienceportal.display(author)
}
}
输出。
GeeksforGeeks@506e1b77
Geeks@4fca772d
Author@9807454
这里,Lower bound定义在ComputerSciencePortal类中,GeeksforGeeks是作者的超级类,它被接受在Lower bound中。
// Scala Program To Demonstrate Scala Lower Bound
class Principal
class Teacher extends Principal
class Student extends Teacher
class School
{
// Declaration of lower bound
def display [T >: Teacher](t: T)
{
println(t)
}
}
// Object created
object ScalaUpperBounds
{
// Driver code
def main(args: Array[String])
{
// Defined new variable
val principal = new Principal
val teacher = new Teacher
val student = new Student
val school = new School
school.display(principal)
school.display(teacher)
school.display(student)
}
}
输出。
Principal@506e1b77
Teacher@4fca772d
Student@9807454
在这里,我们定义了班级学校的下限,即[T >: Teacher],这意味着显示方法接受主类对象或它的子类(即教师)或教师类的子类(即学生),这意味着教师的超类将被接受。
极客教程