scala 中的循环类型参数定义

2023-12-07

我试图定义一个通用容器,其元素可以返回封闭容器。就像是:

abstract class Container[E <: Element] { // compile error
  def contains( e: E ): Boolean
  def addNewElement(): Unit
}

abstract class Element[C <: Container] { // compile error
  def enclosingContainer(): C
}

class MyContainer extends Container[MyElement] {
  private var elements = List[MyElement]()
  override def contains( elem: MyElement ) = elements.contains( elem )
  override def addNewElement() { elements ::= new MyElement(this) }
}

class MyElement( container: MyContainer ) extends Element[MyContainer] {
  override val enclosingContainer = container
}

但是该片段无法编译,因为我应该给一个类型参数Element in the abstract class Container[E <: Element]定义和类型Container in the abstract class Element[C <: Container]定义。

我有办法实现我正在寻找的行为吗?是否有适当的声明Container and Element?我应该定义第三方对象吗?


已经给出的其他解决方案无法强制类型匹配:也就是说,给定一个类型ContainerImpl extends Container,你应该确定ContainerImpl.E.C应该ContainerImpl而不是其他容器。这是强制执行这一点的一个(改编自http://programming-scala.labs.oreilly.com/ch13.html):

abstract class ContainerWithElement {
  type C <: Container
  type E <: Element

  trait Container {
    self: C =>
    def contains( e: E ): Boolean
    def addNewElement(): Unit
  }

  trait Element {
    self: E =>
    def enclosingContainer(): C
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scala 中的循环类型参数定义 的相关文章

随机推荐

  • 我什么时候应该使用@android:id/?

    我找到了一些代码示例 android id xyz属性集而不是 id xyz 何时以及为什么需要使用 Android id 而不是用户的 id 加号表示资源是新的 必须创建它并添加到资源中R java file 省略加号会引用已存在的资源
  • EvtArchiveExportedLog 失败并显示 ERROR_DIRECTORY

    我需要在 Windows Server 2008 R2 上将一些事件从 Windows 事件日志导出到 XML 为了实现这一目标 我使用 EvtExportLog 将这些事件导出到文件 然后尝试使用 EvtArchiveExportedLo
  • 在 Swift 中从单个字符串转换为 ASCII 值的最简单方法是什么?

    我只想在 Swift 中获取单个字符字符串的 ASCII 值 这就是我目前正在做的 var singleChar a println singleChar unicodeScalars singleChar unicodeScalars s
  • if 语句的比较在 bash 中与 test 命令没有按预期工作[重复]

    这个问题在这里已经有答案了 我是一名新手 正在努力让我的第一个 如果那么 语句发挥作用 我编造了一个完全胡说八道的情况来用作试验 但它不起作用 我已经阅读了大约一半关于如何格式化 if then 的描述 但我不知道我可能做错了什么 我的脚本
  • 为什么windows需要withSocketsDo?

    在windows中 socket需要初始化 如图Networks 在 Windows 操作系统上 必须先使用 withSocketsDo 初始化网络子系统 然后才能使用任何网络操作 例如 main withSocketsDo do 尽管这仅
  • Sendgrid API - JSON 调用

    我正在尝试从 SendGrid API 接收数据 ajax type GET url https sendgrid com api bounces get json data api user username api key userke
  • 如何将 @Transactional 与 Spring Data 一起使用?

    我刚刚开始从事 Spring data Hibernate MySQL JPA 项目 我切换到 spring data 这样我就不必担心手动创建查询 我注意到使用 Transactional当您使用 spring data 时不需要 因为我
  • StandardOutput.ReadLine() 使用 C# 挂起应用程序

    以下是应用程序代码 有时 p StandardOutput ReadLine 工作正常 但有时会挂断 我尝试了所有方法 但仍然收到此错误 ProcessStartInfo startInfo new ProcessStartInfo c w
  • MySQL:如何多次连接同一个表?

    我有两张桌子ticket and attr Table ticket has ticked id领域和其他几个领域 桌子attr有3个字段 ticket id numeric attr type numeric attr val strin
  • 是否有基于 oauth 的 Twitter 数据源可用于 CakePHP?

    有一个可用于旧的基本身份验证 但它不再起作用 这是对此类事情的一个很好的介绍 如果您想编写自己的或使用 Neils 插件 http tv cakephp org video CakeFoundation 2010 12 24 neil cr
  • Chrome 配置文件禁用“了解您的位置”弹出窗口

    我正在 Google Chrome 中运行我的测试chromedriver exe二进制 在一个特定页面上会出现此弹出窗口 它不会干扰 影响测试 但客户不想看到它 可能的原因可能是 在测试用例失败时 它将捕获屏幕截图以及此弹出窗口 我怎样才
  • 在TabLayout(Android设计支持库)中更改选项卡的背景颜色不会占用整个选项卡空间

    我有一个 TabLayout 设计支持库 它与包含三个选项卡的 ViewPager 绑定 我设计了一个自定义布局并将其设置到 TabLayout 中的每个选项卡 我一直在尝试更改当前所选选项卡的背景颜色 颜色仅包围选项卡中的文本 但不占据整
  • 构建输出去哪里?

    我在 Xcode 4 中有一个库项目 我正在针对 iOS 4 3 进行构建 构建产品路径设置为 Developer Projects BuildOutput 我正在构建 iPhone 4 3 模拟器 在 Xcode4 中 如何指定调试或发布
  • 在线运行oracle sql代码[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 有没有任何网站可以让您编写 Oracle sql 代码 甚至可以构建一个小型数据库来使用 运行它并查看输出 我尝试过在线搜索 但除此之外我什么也找不到W3学校网站 SQL小提琴将允许
  • 示例:scanf 和 char 错误

    我正在阅读 C for Dummies 并正在做书中的一个例子 它告诉我要一行一行地写出来 然后 即使代码存在错误 也会继续阅读本书 这里是 include
  • 打印数组列表

    我有一个包含 Address 对象的 ArrayList 如何打印此 ArrayList 的值 这意味着我正在打印数组的内容 在本例中为数字 我只能用以下代码让它打印出数组的实际内存地址 for int i 0 i lt houseAddr
  • Android 中的 Splash 不工作

    我正在尝试在 Android 中为我的应用程序创建一个启动屏幕 但它根本不会显示 我使用的代码是 4 个不同的文件 这里是 飞溅 java package com timchecklist import android app Activi
  • 如何在 Watson Conversation 中提供个性化问候语?

    在 Watson Conversation 中定义对话框时 我无法用用户的名字问候用户 或者无法检测用户发送的联系号码并将其重新表述给用户 是否可以在 Watson Conversation Api 中执行此操作 尽管米奇的回答是正确的 但
  • 给定相关数字列表,合并相关列表以创建不相交的集合

    Given 1 2 3 4 5 6 3 7 5 7 Output set 1 2 set 3 4 5 6 7 解释 1 2 1 2 3 4 1 2 3 4 5 6 1 2 3 4 7 5 6 1 2 3 4 7 5 6 我写了一个糟糕的算法
  • scala 中的循环类型参数定义

    我试图定义一个通用容器 其元素可以返回封闭容器 就像是 abstract class Container E lt Element compile error def contains e E Boolean def addNewEleme