📜  斯卡拉 |下限

📅  最后修改于: 2022-05-13 01:55:04.697000             🧑  作者: Mango

斯卡拉 |下限

Type Bound基本上是对参数或变量的一种限制。通过使用这些类型边界,我们可以为变量设置限制。这些界限有助于将我们的代码放入现实世界的示例中。我们需要对现实生活中的每个因素施加一定的限制和界限,这就是 Scala 中的类型界限所做的。

主要有 2 种类型边界:

  • 上部类型绑定
  • 较低的类型绑定

    在本节中,我们将更加关注下界。较低的类型边界用于声明另一种类型的超类型。下界由>:表示。任何下限语句都可以写为'[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)

    通过这个声明,我们可以说我们可以定位任何超类型的水果,这意味着可食用的和食物。因此,通过这一点,我们可以肯定地看到,如果对任何现实世界的示例使用一些逻辑,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 是 Author 的 Super 类。它在下限中被接受。

    // 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
    

    在这里,我们在 Class School 中定义了下界,即 [T >: Teacher],这意味着 display 方法接受 Principal 类对象或其子类(即 Teacher)或 Teacher 类的子类(即 Student),这意味着老师会被录取。