gpt4 book ai didi

Scala UpperBound 和 LowerBound 概念

转载 作者:行者123 更新时间:2023-12-04 05:51:47 25 4
gpt4 key购买 nike

下面是我试图运行的代码:

class Student {
def printDetails = println("I am a student")
def printSomeOtherDetails = println("I love Studying")
}

class ComputerScienceStudent extends Student {
override def printDetails = println("I am a Computer Science Student")
override def printSomeOtherDetails = println("I love Scala")
}

class InformationTechnologyStudent extends Student {
override def printDetails = println("I am an Information Technology Student")
override def printSomeOtherDetails = println("I love Java")
}

class MyGenericClassForUpperBound {
def printStudentDetails[S <: Student](student: S) = {
student.printDetails
student.printSomeOtherDetails
}
}

class MyGenericClassforLowerBound {
def printStudentDetails[S >: ComputerScienceStudent](student: S) = {
student.printDetails
student.printSomeOtherDetails
}
}

方法 printStudentDetails来自 MyGenericClassforLowerBound正在制造问题。声明 student.printDetailsstudent.printSomeOtherDetails告诉我
value printDetails is not a member of type parameter S

据我了解:
  • Q[A <: B]表示类/方法 Q可以接受类 A 的任何对象哪里类A是类 B 的子类型.这称为上限。
  • Q[A >: B]表示类/方法 Q可以接受类 A 的任何对象哪里类A是类的父类(super class)型B .这称为下限。

  • 如果我的理解有误,请帮助我,并帮助我理解为什么会出现上述问题。谢谢你们。

    最佳答案

    你的理解没有错,只是你没有追究后果。

    具体来说,所有参数实际上都有一个上限 Object如果没有提供明确的上限。这种情况发生在方法 printStudentDetails 的情况下。在您的类型MyGenericClassforLowerBound .也就是说,类型为 Object 的值可以合法地作为参数传递给这个方法。但是输入 Object没有定义方法 printDetailsprintSomeOtherDetails - 因此错误。

    要使方法编译,您还需要提供合适的上限(类似于 MyGenericClassforUpperBound ),例如:

    def printStudentDetails[S >: ComputerScienceStudent <: Student](student: S) = { ...

    然而,在这种情况下应该注意,下限实际上变得多余,因为任何子类 Student 的参数可以成功传入,因为它可以被视为类型 Student ,满足上限 - 所以均匀 InformationTechnologyStudentComputerScienceStudent 的子类可以成功传入。当您可能传入混合了来自两个不同层次结构的类型的值时,这种构造更有用。

    关于Scala UpperBound 和 LowerBound 概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19821824/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com