下面是我试图运行的代码:
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
}
}来自MyGenericClassforLowerBound的方法MyGenericClassforLowerBound正在创建这个问题。student.printDetails和student.printSomeOtherDetails的声明告诉我
value printDetails is not a member of type parameter S据我所知:
Q[A <: B]意味着类/方法Q可以接受类A的任何对象,其中类A是类B的子类型。这叫做上界。Q[A >: B]意味着类/方法Q可以接受类A的任何对象,其中类A是类B的超级类型。这叫做下界。请帮助我,如果我的理解是错误的,并帮助我理解为什么会出现上述问题。谢谢你们。
发布于 2013-11-06 20:20:08
你的理解并没有错,但你还没有经历过后果。
具体来说,如果不提供显式上界,所有参数实际上都具有Object的上界。这种情况发生在您的类型为printStudentDetails的方法MyGenericClassforLowerBound中。也就是说,Object类型的值可以合法地作为该方法的参数传递。但是类型Object没有定义printDetails和printSomeOtherDetails方法,因此出现了错误。
要使方法编译,还需要提供一个合适的上限(类似于MyGenericClassforUpperBound),例如:
def printStudentDetails[S >: ComputerScienceStudent <: Student](student: S) = { ...但是,在这种情况下,需要注意的是,下界实际上是多余的,因为子类Student所传递的任何参数都可以成功地传入,因为它可以作为Student类型处理,满足上界--因此即使InformationTechnologyStudent和ComputerScienceStudent的子类也可以成功地传递到它中。当您在两个不同层次结构的类型中混合的值中传递时,这种类型的构造更有用。
https://stackoverflow.com/questions/19821824
复制相似问题