使用“type”关键字和路径相关类型覆盖类型

2024-01-06

假设我有这样的代码:

trait  Holder  {
  type Value
  def put(v:Value)
}

class JsonHolder extends Holder {
  override type Value = String
  def put(v: JsonHolder.this.Value): Unit = {}
}

class XmlHolder extends Holder {
  override type Value = String
  def put(v: XmlHolder.this.Value): Unit = {}
}

object Foo {
  def main(args: Array[String]) {
    val jsonHolder = new JsonHolder
    val xmlHodler = new XmlHolder
    val valueOfJson = new jsonHolder.Value("AAA")
    val valueOfXml = new xmlHodler.Value("AAA")
    jsonHolder.put(valueOfXml)
  }
}

我不明白为什么会这样编译。 jsonHolder.put(valueOfXml) 不应该出现类型错误吗?

如果我改变

type Value

像这样的事情:

case class Value(content:String)

并删除覆盖行,其他所有内容都保持原样,类型不匹配错误实际上会显示出来。

那么这两者之间有什么区别,因为 put 参数的声明不必改变并且行为完全不同?


嗯,这不是类型错误,因为两者JsonHolder.Value and XmlHolder.Value are Strings。考虑type其他类型的别名。所有类型都替换为其实际类型。所以你的代码大致如下所示:

val valueOfJson = new String("AAA") // JsonHolder.Value is a String
val valueOfXml = new String("AAA") // XmlHolder.Value is a String as well

像这样:

class JsonHolder extends Holder {
  def put(v: String): Unit = {}
}

class XmlHolder extends Holder {
  def put(v: String): Unit = {}
}

例如,如果您的其中一种类型是Int那么你肯定会得到一个编译错误:

class JsonHolder extends Holder {
  override type Value = Int
  def put(v: JsonHolder.this.Value): Unit = {}
}

class XmlHolder extends Holder {
  override type Value = String
  def put(v: XmlHolder.this.Value): Unit = {}
}

object Foo {
  def main(args: Array[String]) {
    val jsonHolder = new JsonHolder
    val xmlHodler = new XmlHolder
    //compilation error here - Int doesn't have a String constructor
    val valueOfJson = new jsonHolder.Value("AAA") 
    val valueOfXml = new xmlHodler.Value("AAA")
    jsonHolder.put(valueOfXml)
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用“type”关键字和路径相关类型覆盖类型 的相关文章

随机推荐

  • 合并来自单独存储库的 Mercurial 分支

    我试图弄清楚如何将分支从单独的存储库合并到当前存储库中 我有以下内容 PJT1 包含默认分支和 foodog PJT2 包含分支默认值 从 PJT2 开始 我执行以下操作 hg fetch y PJT1 r foodog m this is
  • macOS 上的 SwiftUI,如何在 Button 上使用自定义图像符号?

    请仔细阅读问题 这是一个 MAC 应用程序 systemName 在 mac os 上不可用 我正在尝试在 macOS 上使用 swiftUI 构建一个简单的应用程序 但是在显示某些图标时遇到一些问题 我现在到处都读到 您需要下载 SF S
  • 将输入存储到数组 C++

    我正在学习数组 我想尝试的是首先让用户输入 x y 值 4 次 例如 第一次 x 1 y 3 第二次 x 2 y 3 第三次 x 3 y 1 第四次 x 1 y 3 然后将用户输入 4 次的值存储在数组中并将其打印出来 但我得到了一些奇怪的
  • 无法启动 springboot 管理,java.lang.NoClassDefFoundError: org/springframework/cloud/netflix/zuul/filters/TraceProxyRequestHelper

    当我创建示例项目时尝试使用 spring boot admin 遵循 http codecentric github io spring boot admin 1 4 1 http codecentric github io spring
  • 静态绑定和动态绑定有什么区别?

    绑定时间可以分为两种类型 静态和动态 静态绑定和动态绑定有什么区别 您能举一个简单的例子来进一步说明吗 用最一般的术语来说 静态绑定意味着引用已解析在编译时 Animal a new Animal a Roar The compiler c
  • 类型级别数算术

    我正在研究 F 的类型推断器 尝试让类型级别的自然数正常工作 这是我设法开始工作的部分 type Zero Zero type Succ lt a gt None type True True type False False type I
  • xvalue 不都是左值和右值吗?

    我读了这个answer https stackoverflow com a 27364969引起我注意的部分是 int i int p i int f int g int h h prvalue g glvalue xvalue f glv
  • 在 IIS 上部署plotly dash

    我正在尝试将一个阴谋破折号部署到 IIS 首先 我按照链接中的说明进行操作 IIS 上的 Flask James Polera https netdot co 2015 03 09 flask on iis 然后当我使用这个脚本时它就可以工
  • 我可以使用 perl 创建数据透视表吗?

    我使用 Excel Writer XLSX 模块使用 Perl 生成 Excel 文件 我把数据放在一张纸上 我想在创建 Excel 文件时自动创建包含该数据的数据透视表和图表 数据透视表和图表需要有过滤器 所以我可以选择月 周 状态 部门
  • Kafka主题未被删除

    我使用的是卡夫卡 0 10 0 1 集群中有 3 个代理 我发出了删除命令 删除了近 10 个一个月以来没有使用过的主题 我检查过 没有消费者注册这些主题 他们的日志大小也没有增加 然而 已经过去5个多小时了 那些话题还没有被删除 它们只是
  • 为什么使用迭代器而不是数组索引?

    采取以下两行代码 for int i 0 i lt some vector size i do stuff 和这个 for some iterator some vector begin some iterator some vector
  • PHP 的 T_VAR 错误

    我正在开发一个 html 表单 它将数据发送到一个显示它的 php 文件 最终我会让 php 将数据发送到 mysql 数据库 当我提交表单时 出现 php 错误 解析错误 语法错误 第 2 行 home2 rocksoli public
  • 如何从测试导航器中删除 Xcode Swift 测试类?

    Xcode 测试导航器显示测试用例类的列表 我想删除一个测试用例类 因为不再需要它 我尝试过许多典型的方法 例如按删除键 或查找 图标 或 删除 菜单项 或在 Apple Xcode 文档中搜索帮助 我找到了这个解决方法 在项目导航器中 从
  • Facebook API 营销:创建自定义受众的问题

    我尝试通过 APPUID 将用户添加到自定义受众 我确实发布到网址https graph facebook com v2 10 CUSTOM AUDIENCE ID users https graph facebook com v2 10
  • Emacs 日历:显示超过 3 个月?

    在 Emacs 中 当您使用以下命令显示日历时M x calendar 您可以在一个只有 8 行高的新窗口中显示三个月的信息 上个月 本月和下个月 是否可以在全尺寸窗口中生成十二个月的日历 12 个月日历 按月滚动 向前 向后 Scroll
  • 检测由于违反唯一约束而导致的 mysql 更新/插入失败

    这有点类似于这个问题 PHP MySQL INSERT 由于唯一约束而失败 https stackoverflow com questions 2756186 php mysql insert fails due to unique con
  • 如何从 MS SQL 数据表中检索列默认值

    我在用DataAdapter FillSchema从 MS SQL 检索表的架构 不幸的是 这不会返回列的默认值 当我需要检查数百个表时 有没有一种方法可以快速有效地检索此值作为架构的一部分 Thanks 默认值仅在行插入时确定 作为替代方
  • 如果 WPF 应用程序强制关闭或崩溃,处理 WPF 关闭事件

    我有一台名为 GameServer 的服务器 它持续运行 并且多个 ClientApplication 正在不同的不同机器上运行 当用户登录到服务器时 我将根据登录用户将一些数据保存到服务器 注销后我将对数据库以及我为登录用户对服务器所做的
  • 使用 Python 格式化 APNS 样式的 JSON 消息以与 Amazon SNS 一起使用

    我正在创建一个 iOS 应用程序 对于您的推送通知 我们使用 Amazon Simple Notification Service SNS SNS 很棒 但文档却相当稀疏 我在用着boto http docs pythonboto org
  • 使用“type”关键字和路径相关类型覆盖类型

    假设我有这样的代码 trait Holder type Value def put v Value class JsonHolder extends Holder override type Value String def put v J