首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala UpperBound和LowerBound概念

Scala UpperBound和LowerBound概念
EN

Stack Overflow用户
提问于 2013-11-06 20:11:19
回答 1查看 3.1K关注 0票数 9

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

代码语言:javascript
复制
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.printDetailsstudent.printSomeOtherDetails的声明告诉我

代码语言:javascript
复制
value printDetails is not a member of type parameter S

据我所知:

  • Q[A <: B]意味着类/方法Q可以接受类A的任何对象,其中类A是类B的子类型。这叫做上界。
  • Q[A >: B]意味着类/方法Q可以接受类A的任何对象,其中类A是类B的超级类型。这叫做下界。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-06 20:20:08

你的理解并没有错,但你还没有经历过后果。

具体来说,如果不提供显式上界,所有参数实际上都具有Object的上界。这种情况发生在您的类型为printStudentDetails的方法MyGenericClassforLowerBound中。也就是说,Object类型的值可以合法地作为该方法的参数传递。但是类型Object没有定义printDetailsprintSomeOtherDetails方法,因此出现了错误。

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

代码语言:javascript
复制
def printStudentDetails[S >: ComputerScienceStudent <: Student](student: S) = { ...

但是,在这种情况下,需要注意的是,下界实际上是多余的,因为子类Student所传递的任何参数都可以成功地传入,因为它可以作为Student类型处理,满足上界--因此即使InformationTechnologyStudentComputerScienceStudent的子类也可以成功地传递到它中。当您在两个不同层次结构的类型中混合的值中传递时,这种类型的构造更有用。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19821824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档