使用Scala case类构造函数作为方法调用时类型不匹配

时间:2018-06-21 07:47:31

标签: scala functional-programming implicit

使用自定义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以及与其他类似问题有关的其他地方有很多问题,但是我找不到遇到此特定问题的任何问题。

1 个答案:

答案 0 :(得分:1)

您正在传递伴随对象作为参数。 与所有单例对象一样,其类型为CustomNode.type

使用.apply方法的用户略有不同。

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