加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala UpperBound和LowerBound概念

发布时间:2020-12-16 08:59:18 所属栏目:安全 来源:网络整理
导读:以下是我尝试运行的代码: 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 Compute
以下是我尝试运行的代码:

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的方法printStudentDetails正在创建问题. 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的超类型.这称为下限.

如果我的理解是错误的,请帮助我,并帮助我理解为什么上述问题即将到来.多谢你们.

解决方法

你的理解没有错,但你没有遵循后果.

具体而言,如果没有提供明确的上限,则所有参数实际上都具有Object的上限.对于类型为MyGenericClassforLowerBound的方法printStudentDetails,会发生这种情况.也就是说,Object类型的值可以合法地作为参数传递给此方法.但是类型Object没有定义printDetails和printSomeOtherDetails方法 – 因此错误.

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

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

但是应该注意,在这种情况下,下限实际上变得多余,因为子类Student的任何参数都可以成功传递,因为它可以被视为类型为Student,满足上限 – 所以甚至是InformationTechnologyStudent和子类ComputerScienceStudent可以成功传递给它.当您可以传递来自两个不同层次结构的类型的值时,这种构造更有用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读