scala - 使用 Scala 案例类构造函数作为方法调用时的类型不匹配
问题描述
在使用自定义 XML 格式解析器时,我实现了一个简单的案例类:
case class CustomNode(tree: XmlTree)(implicit val filename: String) { ... }
在另一个调用中,我像这样构造该类的对象:
implicit val filename: String = ...
val tree: XmlTree = ...
val nodes: Seq[CustomNode] =
tree.descendant
.filter(CustomXml.isCustomNode)
.map(CustomNode(_))
这按预期工作正常。但是,CustomNode(_)
调用看起来很别扭,所以我将其转换为方法值,即:
val nodes: Seq[CustomNode] =
tree.descendant
.filter(CustomXml.isCustomNode)
.map(CustomNode) // <-- changed
这会导致编译错误:
Error:(23, 12) type mismatch;
found : CustomNode.type
required: XmlTree => ?
.map(CustomNode)
我使用 SBT 1.1.1 版和 Scala 2.12.4 版进行构建。
这只是一个外观问题,但我仍然想知道第二个电话有什么问题。
顺便说一句,我的 IDE(IntelliJ IDEA)也建议对第一个版本进行此更改,而后一个版本看起来不错。
StackOverflow 和其他地方有很多与类似点相关的问题,但我找不到任何遇到此特定问题的问题。
解决方案
您将伴随对象作为参数传递。它的类型CustomNode.type
与所有单例对象一样。
一个稍微不同的方式是用户.apply
方法。
val nodes: Seq[CustomNode] =
tree.descendant
.filter(CustomXml.isCustomNode)
.map(CustomNode.apply)
推荐阅读
- javascript - 定义的变量不会显示在窗口对象中
- html - Bootstrap 表行不适合 headerrow (Angular)
- android-studio - 当用户从另一个应用程序返回到我们的应用程序时如何做某事
- powerbi - 在列小计中获取正确的值
- geopandas - geopandas 光栅化 shpefile
- c# - Xamarin Forms CollectionView 无法正确显示
- python - 错误:子类化 `Model` 类时,您应该实现 `call` 方法。在 tensorflow 自定义模型上
- python - 为什么相同的代码工作方式不同?
- laravel - Laravel Sqlite 列索引超出范围
- linux - 更改 MATE 终端选项卡标题的 sh 脚本 [tcsh]