使用“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”关键字和路径相关类型覆盖类型 的相关文章

  • Jack(Java Android 编译器套件)将如何影响 Scala 开发人员

    现在随着公告Jack https source android com source jack html谷歌阐明了 Java 与 Android 相关的可预见的未来 但这对 Scala 和其他基于 JVM 的语言开发人员有何影响 尤其 Sc
  • xsbt 插件 1.0.0-M7 和 scalatra

    我尝试在我的 scalatra 项目中将 xsbt 插件升级到 1 0 0 M7 但 scalatra 似乎与此版本不兼容 当我尝试重新加载项目时 出现以下错误 我尝试过 scalatra 2 3 0 版本 问候 德斯 java lang
  • 如何使用精炼库定义 A 和 B 取决于彼此的类型类?

    Problem 我有一个案例类 Passenger 从 A 点出发 前往 B 点 有效乘客意味着A点不等于B点 Passenger a Int b Int 问题 我如何使用设计乘客舱refind https index scala lang
  • 在 AKKA 中,对主管调用 shutdown 是否会停止其监督的所有参与者?

    假设我有一位主管连接了 2 位演员 当我的应用程序关闭时 我想优雅地关闭这些参与者 调用supervisor shutdown 是否会停止所有参与者 还是我仍然需要手动停止我的参与者 gracias 阻止主管 https github co
  • 与文件名中的冒号“:”作斗争

    我有以下代码 用于加载大量 csv gz 并将它们转储到其他文件夹中 并将源文件名作为一列 object DailyMerger extends App def allFiles path File List File val parts
  • 导入 sbt 项目时出错,服务器访问错误,未解决的依赖项

    我正在尝试从 IntelliJ IDE 15 0 2 的 build sbt 中导入我的项目中的库 我不断收到未解决的依赖项错误 我尝试更新不同论坛的设置来解决该问题 但没有任何效果 我尝试过的几件事 使用代理设置更新 sbtconfig
  • 从 GUID 获取类型

    由于种种原因 我需要在C 中实现类型缓存机制 幸运的是 CLR 提供了Type GUID来唯一标识一个类型 不幸的是 我找不到任何方法来根据此 GUID 查找类型 有Type GetTypeFromCLSID 但根据我对文档 和实验 的理解
  • 如何修复 Typescript 中的“以下属性中缺少类型‘{}’...”错误?

    我是 Typescript 新手 因此遇到了问题 我正在使用 Ant Design 并遵循如何在 Typescript 中使用 Form 但使用FunctionComponent 但是 我收到 Typescript 抛出的错误 TypeSc
  • 如何从DataFrame中获取最后一行?

    我有一个DataFrame 该DataFrame有两列 value 和 timestamp timestmp 是有序的 我想获取DataFrame的最后一行 我该怎么办 这是我的输入 value timestamp 1 1 4 2 3 3
  • 如何将 JVM 选项传递给 SBT 以在运行应用程序或测试用例时使用?

    我想在运行我的应用程序或通过 SBT 对应用程序进行测试时指定 JVM 选项 具体来说 我需要能够为 JVM 提供 Djava security policy 参数 以便加载我的策略并用于测试 我怎样才能用 SBT 做到这一点 With x
  • 从模板切换传递的类型

    在 C 中是否可以检查传递给模板函数的类型 例如 template
  • 使用 lift-json 反序列化具有 Map[String,Any] 属性的案例类

    几天来我一直在努力解决一些通过 lift json 应该很简单的事情 将映射序列化为 JSON 我知道 我知道 根对象还不能是 List 或 Map 但我愿意暂时包装在一个案例类中 但我仍然无法让它工作 感谢一些堆栈溢出帮助 我已经可以进行
  • 如何在 scala 中的二维数组上使用 contains 方法

    我有一个二维数组 我想检查二维数组内是否存在数组 我努力了 var arr Array Array 2 1 Array 4 3 var contain arr contains Array 4 3 println contain 这应该打印
  • 如何为每个用户或系统范围配置 Ivy 缓存目录?

    我在用SBT http www scala sbt org 作为我构建 Scala 项目的构建工具 我的问题是 我无法配置 SBT 将依赖项下载到我的用户主目录 因此 我正在寻找每个用户甚至更好的系统范围设置来告诉 SBT 将 Ivy 缓存
  • 用于测试对象类型的通用 Swift 函数

    我正在尝试编写一个函数 该函数接受一个对象和一个类型作为参数 并返回一个布尔值 指示该对象是否属于给定类型 似乎没有 Type 类型 所以我不知道如何做到这一点 我能做的最好的就是 func objectIsType
  • Spark JSON 文本字段到 RDD

    我有一个 cassandra 表 其中有一个名为 snapshot 的文本类型字段 其中包含 JSON 对象 identifier timestamp snapshot 我了解到 为了能够使用 Spark 对该字段进行转换 我需要将该 RD
  • 命名和未命名类型

    问题 我最近开始阅读Golang规格手册 https golang org ref spec并陷入试图理解的困境有名和无名类型在相关部分 https golang org ref spec Types 我来自动态语言 这让我有点头疼 手册指
  • scalac 编译生成“对象 apache 不是包 org 的成员”

    我的代码是 import org apache spark SparkContext 它可以在交互模式下运行 但是当我使用 scalac 编译它时 出现以下错误消息 对象 apache 不是包 org 的成员 这似乎是路径的问题 但我不知道
  • lxml 的类型提示?

    Python 新手 具有静态类型语言背景 我想要类型提示https lxml de https lxml de只是为了便于开发 mypy 标记问题并建议方法会很好 据我所知 这是一个 python 2 0 模块 没有类型 目前我用过http
  • 如何检测数据库类型?

    我需要确保我连接的数据库是 MySQL 而不是 PostgreSQL 或 Microsoft SQL Server 我怎样才能知道正在使用哪种类型的数据库 第一个提示可能是如果您尝试使用 mySQL 数据库驱动程序连接到 PostgreSQ

随机推荐

  • 合并来自单独存储库的 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