首页 > 解决方案 > 使用 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 和其他地方有很多与类似点相关的问题,但我找不到任何遇到此特定问题的问题。

标签: scalafunctional-programmingimplicit

解决方案


您将伴随对象作为参数传递。它的类型CustomNode.type与所有单例对象一样。

一个稍微不同的方式是用户.apply方法。

val nodes: Seq[CustomNode] =
     tree.descendant
       .filter(CustomXml.isCustomNode)
       .map(CustomNode.apply)

推荐阅读