下面是我尝试运行的代码:
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
from MyGenericClassforLowerBound
正在制造问题。声明student.printDetails
and 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
。这称为下界。
如果我的理解错误,请帮助我,并帮助我理解为什么会出现上述问题。多谢你们。
你的理解没有错,但是你没有去承担后果。
具体来说,所有参数实际上都有一个上限Object
如果没有提供明确的上限。这种情况发生在该方法的情况下printStudentDetails
在你的类型中MyGenericClassforLowerBound
。也就是说,一个类型的值Object
可以合法地作为参数传递给此方法。但是输入Object
没有定义方法printDetails
and printSomeOtherDetails
- 因此出现错误。
为了使该方法编译,您还需要提供一个合适的上限(类似于MyGenericClassforUpperBound
), eg:
def printStudentDetails[S >: ComputerScienceStudent <: Student](student: S) = { ...
然而,应该注意的是,在这种情况下,下界实际上变得多余,因为子类化的任何参数Student
可以成功传入,因为可以将其视为类型Student
,满足上限 - 所以均匀InformationTechnologyStudent
和子类ComputerScienceStudent
可以成功传入其中。当您可能传入混合来自两个不同层次结构的类型的值时,这种构造更有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)