为什么在 Scala 中对 Option.getOrElse 的返回值使用隐式转换时类型推断失败?

2023-12-03

例如我有一堂课Value和一个隐式函数将字符串转换为值:

case class Value(v: String)

implicit def strToValue(s: String): Value = Value(s)

这是一个有方法返回值的特征:

trait ReturnValue {
  def f: Value
}

因为存在隐式转换,所以我可以实现方法f只需返回一个字符串文字:

object Obj1 extends ReturnValue {
  override def f: Value = "123"
}

当然,返回 String 类型的变量也可以正常工作:

object Obj2 extends ReturnValue {
  override def f: Value = {
    val v = Some("123").getOrElse("234")
    v
  }
}

但是当我尝试直接使用 Option.getOrElse 的结果作为返回值时:

object Obj3 extends ReturnValue {
  override def f: Value = Some("123").getOrElse("234")  // Compilation error: type mismatch
}

出现编译错误:

Error:(23, 50) type mismatch;
 found   : java.io.Serializable
 required: Entry.Value
   override def f: Value = Some("123").getOrElse("234") // Compilation error: type mismatch

看来这里的类型推断失败了。类型String没有推断出来,那么隐式转换就无法匹配。 (完整文件是here)

我尝试过其他具有类型参数的函数,例如“map”,它们都工作得很好。

为什么 Option.getOrElse 如此特殊以至于类型推断在这里失败?


此变体会导致相同的编译错误,并且可能显示编译器如何解构表达式:

object Obj3 extends ReturnValue {
  override def f: Value = {
    val v = Some("123") // is of type Some(String)
    v.getOrElse("234": Value)  // Compilation error: type mismatch
  }
}

没有任何特征也可以实现相同的错误,只需以下简单的重现:

case class Value(v: String)

implicit def strToValue(s: String): Value = Value(s)

val vs  = Some("123")

val v: Value = vs.getOrElse("234")

编译器似乎将转换应用于Value论据getOrElse,而不是其结果。事实是可以通过启用的输出来确认scalacOptions in Compile ++= Seq("-Xprint-types", "-Xprint:typer")(清理了一下 - 删除了明显不相关的注释):

private[this] val v: 值 =

vs.getOrElse{[B >: String](默认值:=> B)B}[java.io.Serialized]{(默认值:=> java.io.Serialized)java.io.Serialized}(strToValue{(s: String)Value}("234"{String("234")}){Value} ){

我认为推论如下:

  • vs类型被称为Some[String]
  • getOrElse声明是def getOrElse[B >: A](default: => B): B (A is String here)
  • 编译器推断B as Value,因为这是表达式的预期结果类型。
  • 最具体的超类型Value and String is Serializable

您还可以注意完全删除隐式转换时它的行为方式。错误为val v: Value = vs.getOrElse("234")那么就是:类型不匹配; 发现:字符串(“234”) 必填:值

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

为什么在 Scala 中对 Option.getOrElse 的返回值使用隐式转换时类型推断失败? 的相关文章

  • 理解无形状的“单态”示例

    The 无形特征概述 https github com milessabin shapeless wiki Feature overview 3a shapeless 2 0 0显示以下示例 import poly choose is a
  • 使用空/空字段值创建新的数据框

    我正在从现有数据帧创建一个新数据帧 但需要在这个新 DF 中添加新列 下面代码中的 field1 我该怎么做 工作示例代码示例将不胜感激 val edwDf omniDataFrame withColumn field1 callUDF v
  • 在 Play 上强制实施 SSL!框架

    我目前正在使用 Play 1 2 2 及其新的 Netty 客户端框架 尽管可以让 HTTP 和 HTTPS 异步服务 但我还没有找到一种简单的方法来强制执行 SSL 有没有人使用过 Play 有强制实施 SSL 的简单方法吗 不确定我是否
  • 如何在 Scala 中将 DataFrame 模式写入文件

    我有一个 DataFrame 它从一个巨大的 json 文件加载并从中获取架构 该架构基本上大约有 1000 列 我希望将 printSchema 的相同输出保存在文件中而不是控制台中 有任何想法吗 如果您在本地环境中工作 您可以执行以下操
  • 如何在scala中运行时查找类参数数据类型

    import scala reflect runtime universe import scala reflect runtime universe def getType T TypeTag obj T typeOf T case cl
  • Scala Vector 折叠语法(/: 和 :\ 和 /:\)

    有人可以提供一些例子来说明如何 and http www scala lang org archives downloads distrib files nightly docs library scala collection immut
  • Scala:列表中不同的foldRight实现

    我刚刚发现 scala 我在 2 12 上 提供了完全不同的实现向右折叠 for 不可变列表 and 可变列表 不可变列表 List scala override def foldRight B z B op A B gt B B reve
  • Scala 将字符串转换为映射

    转换这个最快的方法是什么 a ab b cd c cd d de e ef f fg 进入 scala 中的可变映射 我从 500MB 文件中读取了这个输入字符串 这就是我关心速度的原因 如果您的 JSON 像您的示例一样简单 即一系列键
  • 凿子“Enum(UInt(), 5)”失败

    当我尝试使用 Chisel 构建 FSM 时 我使用了 Enum 如 Chisel 教程所述 然而 我遇到了这样的错误 my code val sIdle s1 s2 s3 s4 Nil Enum UInt 5 但是 当我执行时sbt ru
  • Slick 3 交易

    我对 slick 3 文档描述事务的方式感到困惑 我有 2 个光滑的代码 如下所示 def doSomething DB withTransaction implicit session gt userDao doSomething add
  • 测试期权价值的更好方法?

    我经常发现自己Option T 对于某些类型T并希望根据某个值来测试期权的价值 例如 val opt Some oxbow if opt isDefined opt get lakes do something 以下代码是等效的 并且不需要
  • 我可以使用从 Java 实现 java 接口的 scala 类吗?

    我正在学习 Scala 很好奇是否可以 创建一个在 Scala 中实现 Java 接口的对象 将对象编译成类文件并将其打包 使用 Java 中的对象 我想在 scala 中实现一个自定义的 lucene 查询解析器 并能够让其他人从 jav
  • 如何将Spark DataFrame插入Hive内表?

    以追加模式将 DF 插入 Hive 内部表的正确方法是什么 看来我们可以使用 saveAsTable 方法直接将 DF 写入 Hive 或将 DF 存储到临时表然后使用查询 df write mode append saveAsTable
  • 如何在 Lift 中反序列化 DateTime

    我在将 org joda time DateTime 字段从 JSON 反序列化到案例类时遇到问题 JSON val ajson parse creationDate 2013 01 02T10 48 41 000 05 00 我还设置了这
  • scala 元组拆包

    我知道这个问题已经以不同的方式出现过很多次 但我仍然不清楚 有没有办法达到以下目的 def foo a Int b Int foo a b right way to invoke foo foo getParams is there a w
  • 通过Listener获取Spark thrift服务器查询中读取的行数

    我正在尝试为我们的 ST 服务器构建一个监控系统 到目前为止 诸如记录查询 检索的行 红色和花费的时间之类的事情都很好 我已经实现了一个自定义侦听器 我能够毫无问题地检索查询和时间 侦听SparkListenerSQLExecutionSt
  • 我需要比较两个数据帧以进行类型验证并发送非零值作为输出

    我正在比较两个数据帧 基本上 这些是两个不同数据源的模式 一个来自 hive 另一个来自 SAS9 2 我需要验证两个数据源的结构 因此我将模式转换为两个数据帧 它们是 SAS 架构将采用以下格式 scala gt metadata sho
  • 特征/类类型参数优先于方法类型参数的规则是什么

    我已经使用 scala 一段时间了 我认为我真的开始理解一切 好吧 大多数事情 但我发现自己对 Map 类中的许多方法定义感到困惑 我知道 FoldLeft 等如何工作 但我感到困惑的是 Map 函数中使用的类型参数 我们以 FoldLef
  • 使用新的反射API,如何找到类的主构造函数?

    您可以像这样获取类的所有构造函数 import scala reflect runtime universe val ctor typeOf SomeClass declaration nme CONSTRUCTOR asTerm alte
  • java.lang.RuntimeException:不支持的文字类型类org.joda.time.DateTime

    我在一个使用库的项目中工作 这对我来说非常新 尽管我在其他项目中使用它 没有任何问题 org joda time DateTime 所以我和Scala 并将项目作为作业运行数据块 scala版本 2 11 12 根据我到目前为止的调查 异常

随机推荐

  • 如何找到至少2个向量中共有的元素?

    假设我有 5 个向量 a lt c 1 2 3 b lt c 2 3 4 c lt c 1 2 5 8 d lt c 2 3 4 6 e lt c 2 7 8 9 我知道我可以使用以下方法计算它们之间的交集Reduce 和 一起inters
  • C++ 失败时 istream 行为发生变化

    取自 参考参数 直到 C 11 如果提取失败 例如 如果在需要数字的地方输入了字母 则值保持不变并设置失败位 自 C 11 起 如果提取失败 则将零写入值并设置失败位 如果提取结果导致值太大或太小而无法适应值 std numeric lim
  • 使用产品风味时,每种风味中哪些文件是常见的,哪些文件是该风味特有的?

    productFlavors India USA 我们以两种产品口味为例 1 印度 2 美国 构建变体的总数将为 4 1 印度调试 2 印度发布 3 美国调试 4 美国发布 哪些文件对于所有风格都是通用的 哪些文件是特定于风格以及调试和发布
  • 如何在 Coq 中自动证明实数的简单相等?

    我正在寻找的是auto类似的策略可以证明简单的等式 例如 1 2 2 4 到目前为止 我手动尝试过的是使用ring simplify and field simplify来证明等式 即使这样效果也不好 Coq 8 5b3 下面的例子有效 R
  • 将数据从 .data 文件转换为 .csv 文件,并使用 pandas 将数据放入列中

    我想将 data 文件中的数据转换为 csv 文件 并将 data 文件中的数据放入其下带有值的列中 但是 data 文件具有特定的格式 我不知道如何将文本放入列中 data 文件如下所示 column1 column2 column3 c
  • 在提交 Ajax 时生成 CSRF 令牌 codeigniter

    您好 我正在寻找使用 ajax 提交表单时在 codeigniter 中重新生成 csrf 令牌的过程 我希望在不刷新页面的情况下重新生成令牌 有什么办法可以做到这一点吗 我根据情况在不同时间使用两种解决方案 1 方式有点乱 但推荐 获取控
  • 原始 CSS 文件中的条件 IE8 样式?

    我怎样才能只为 IE8 浏览器覆盖这个样式 我认为我不再关心 IE7 用户了 除非标记非常小 menu ul margin 0 padding 0 width 650px menu ul li display inline block wi
  • 找不到带有下划线的路由或者没有正确对待它

    我在路线中有这个 Rails application routes draw do namespace api do namespace v3 4 do 和控制器app controllers api v3 4 base controlle
  • LexResponse 输出无法理解 HTML 数据

    我在尝试让 AWS Lambda 函数在运行 SQL 查询时成功输出一系列 HTML 链接时遇到问题 private string GetEventSearchResults ILambdaContext context List
  • 如何使用 Gson 将 JSON 转换为 HashMap?

    我正在从服务器请求数据 该服务器返回 JSON 格式的数据 在发出请求时将 HashMap 转换为 JSON 一点也不难 但另一种方法似乎有点棘手 JSON 响应如下所示 header alerts AlertID 2 TSExpires
  • 如何使用 Storyboards/Cocoa 在 Swift 3.x 中引用视图的窗口

    随着 Xcode 和 Swift 中的所有更改 我无法弄清楚如何像在使用 XIB 的项目中那样处理 stotyboard 驱动的项目中的视图窗口 macOS 编程新手 如果这是基本内容 请提前道歉 使用故事板时 如何使用以下方法更改视图的窗
  • 具有 k 个部分的排序和非排序整数分区

    对于正整数n and k 让一个 k 分区n 是一个排序列表k不同的正整数加起来为n 并让给定的 等级 k 分区n是它在所有这些列表的排序列表中的位置 按字典顺序从 0 开始 例如 有两个 5 的 2 分区 n 5 k 2 1 4 和 2
  • 如何使 Eclipse Partstack 在最后一个部分关闭时不消失?

    我正在开发一个项目 该项目的主窗口由 mpartstack 组成 我在其中动态地从另一个部分添加部分 问题是 当最后一部分关闭时 mpartstack 消失 而另一部分占用所有空间 当我尝试添加新零件时 什么也没有发生 我尝试通过尝试添加新
  • 当 C 按值传递时,我的数组如何修改?

    我用 C 编写了一个简单的程序来检查两个单词是否是字谜 我的问题是 如果我传递 word one 和 word two 作为参数 这是否意味着我没有修改原始数组 我认为我正在有效地处理这些未归还的副本 这意味着我不应该能够将它们与我的 eq
  • 如何获取芒果的承运商详细信息?

    有没有API可以告诉我们手机是哪个运营商的 例如 沃达丰 祖国 当前国家 详细信息 我在 Microsoft Phone Net NetworkInformation 中找不到此类内容 我是否遗漏了某些内容 感谢帮助 您可以通过静态属性获取
  • 自定义类的比较重载方法

    我想重载个人类的比较方法 例如 如果我这样写 object1 function compare a b if a gt attribute b gt attribute return 0 else return a gt attribute
  • 用换行符绑定文本

    我绑定到带有换行符的字符串 例如 Hello nWorld 在我的模型中 现在我想使用显示模板中的值 x 但换行符未正确显示 聚合物是否为输出提供任何支持 br 用于换行 现在你最好的选择是创建一个Nl2br PolymerElement
  • Windows Phone 7 中的媒体播放器

    我正在使用 Windows Phone 7 中的媒体播放器来播放手机歌曲集中的音乐 但是当它播放音乐时 它们将是一个例外 并且错误指出 尚未调用 Framework Dispatcher Update 定期调用 Framework Disp
  • 代码不等待用户输入?

    我必须为我的计算机科学课做一个项目 问题是 图书馆的读者最多可以借三本书 因此 赞助人有一个名字和最多三本书 一本书有作者和标题 设计并实现两个类 Patron 和 Book 来表示这些对象和以下行为 客户端可以实例化一本书 并带有标题和作
  • 为什么在 Scala 中对 Option.getOrElse 的返回值使用隐式转换时类型推断失败?

    例如我有一堂课Value和一个隐式函数将字符串转换为值 case class Value v String implicit def strToValue s String Value Value s 这是一个有方法返回值的特征 trait