Scala UpperBound 和 LowerBound 概念

2024-05-23

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

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(使用前将#替换为@)

Scala UpperBound 和 LowerBound 概念 的相关文章

随机推荐

  • 如何将 csv 文件读取为键值对的映射

    我的 csv 文件中有数据 例如 value key A Name B Name C Name 24 Age 25 Age 20 Age M Gender F Gender 我想解析它以生成以下地图 Map Name gt List A B
  • 什么是更好的?子查询或内连接十个表?

    一个旧系统已抵达我们的办公室进行一些更改和修复 但它也存在性能问题 我们并不确切知道这种缓慢的根源是什么 当我们重构旧代码时 我们发现了几个具有以下模式的 sql 查询 出于示例目的 简化了查询 SELECT SELECT X FROM A
  • 重定向时重新初始化类

    我目前在http example com parentdir module 2 此 URL 实际上加载 Module js 类 如以下路由所示
  • MIUI 权限被拒绝活动 KeyguardLocked

    当应用程序处于后台且屏幕被锁定时 我无法启动活动 没有异常或警告 只是不调用 onCreate 我一直在与这个问题作斗争 我想我终于找到了它的根源 日志中有一行 D com android server am ExtraActivityMa
  • http和https在编程中有什么区别[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我只知道 s 代表 安全 用户永远不
  • 如何访问其他类中的控件

    我正在学习 C 我需要的是来自其他类的表单的访问控制 相同的命名空间 我知道这里有很多关于这个主题的帖子 但没有找到 傻瓜 的完整解决方案 所以我在这里写下我的想法 请告诉我 这是正确的方法吗 背景 我的应用程序中有一些 调试 表单 我需要
  • VBA在下一个空白行正确输入用户表单数据

    创建了一个用户表单 添加了一个文本框和一个组合框 添加了提交按钮 单击 提交 后 会将数据添加到电子表格中 据我所知和我所读到的 这是错误的 ActiveCell Value TextBox3 Text ActiveCell Offset
  • 在 Ansible 中使用模板模块附加文件

    所以我有一个 ansible 剧本 它使用 Jinja2 模板来创建日志文件 每次我运行剧本时 它都会从customers yml中提取客户信息 并将完整的模板输出到 stunnel conf 文件中 该模板工作正常 但我试图找到一种方法来
  • 在 Vulkan 中,图形队列系列与当前队列系列分离是否有益?

    据我所知 队列系列可能支持呈现到屏幕但不支持图形 假设我有一个同时支持图形和呈现的队列系列 以及另一个仅支持呈现的队列系列 我应该为两个进程使用第一个队列系列 还是应该将第一个队列系列委托给图形 将后者委托给呈现 或者这两种方法之间没有明显
  • VLC 媒体播放器有 C# 界面吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以使用 C 控制台应用程序中的包装器从 VLC 播放中当前播放的文件中读取曲目统计信息 时间 标
  • Rust 中的表达式模板实现类似于 boost::yap

    我正在尝试自学 Rust 作为一个具有挑战性的学习项目 我想复制 C 表达式模板库的设计模式提升 雅普 https www boost org doc libs 1 74 0 doc html yap html 我不需要一个完整的实现 我只
  • SWI-Prolog 中的跨模块“接口”调用

    这可能是 SWI Prolog 模块系统特有的 假设我们有三个 Prolog 模块 在 SWI Prolog 模块系统中 robin 在文件中robin pl arthur 在文件中arthur pl helper 在文件中helper p
  • ijson 失败并出现尾随垃圾解析错误

    for prefix event value in parser print prefix 执行上面的代码后出现以下错误 我不明白错误是什么 ijson common IncompleteJSONError 解析错误 尾随垃圾 nt 194
  • Java:从集合中获取第一项

    如果我有一个集合 例如Collection
  • Graph API:如何获取其他用户的 Outlook 类别

    我想通过 Graph API 获取用户类别 显示名称和颜色列表 GET users id userPrincipalName outlook masterCategories 微软API文档网站 https learn microsoft
  • 控制 OverlayItem 大小

    我正在构建一个在单个 ItemizedOverlay 中包含几十个 OverlayItems 的地图 我的地图设计为可以非常近距离地查看 大约缩放级别 18 并且 OverlayItems 彼此非常接近 地图放大时看起来不错 但是 如果用户
  • 使用 Boto3 以字符串形式打开 S3 对象

    我知道使用 Boto 2 可以使用以下命令将 S3 对象作为字符串打开 get contents as string http boto readthedocs org en latest ref file html highlight c
  • 使用 IE9、10、11 的 CSS 将比例打印到 50% 等百分比

    Zoom css 属性不适用于 IE9 10 11 观察到打印预览 UI 令人不安 默认比例为 缩小以适合 当我将此比例从 缩小 更改为适合 50 时 页面显示正常 打印预览 任何人都可以帮助我如何使用 CSS 代码将比例设置为 50 为页
  • 在后台运行 URL 请求

    我想在一定的时间间隔内发出 url 请求 例如 每 10 分钟应用程序应该发出一次 url 调用并获取一些 json 数据 应用程序在后台运行时应该能够执行此操作 这可以做到吗 如果是这样 这是否违反 Apple 服务条款 有什么限制吗 i
  • Scala UpperBound 和 LowerBound 概念

    下面是我尝试运行的代码 class Student def printDetails println I am a student def printSomeOtherDetails println I love Studying clas