Scala:在函数中访问子类型信息

时间:2015-11-09 17:32:36

标签: scala

我有一个简单的ADT:

trait OutputFormat
case class JsonOutputFormat() extends OutputFormat
case class AvroOutputFormat() extends OutputFormat

我将其中一个的实例传递给函数:

def save(data: List[String], format: OutputFormat)

我希望在format上进行模式匹配,但由于它被转发为OutputFormat,我无法使用匹配项:

format match {
  case AvroOutputFormat =>
    logger.info(s"Writing Avro output to $outputPath")
    ...

  case JsonOutputFormat =>
    logger.info(s"Writing JSON output to $outputPath")
    ...
}

做我想做的事情的最佳方法是什么?我可以传递一个通用的,但是这有点乱,因为我想用{:1>之类的东西来调用save

formats map (f => save(data, f))

在这里使用泛型会很棘手,特别是对于类型擦除。

另一种方法是将format更改为字符串,但后来我失去了使用ADT的优雅。

我是否还有其他优雅的解决方案?

1 个答案:

答案 0 :(得分:2)

这就是模式匹配的用途。你有什么作品,我在下面编辑过。

format match {
  case _: AvroOutputFormat =>
    logger.info(s"Writing Avro output to $outputPath")
    ...

  case _: JsonOutputFormat =>
    logger.info(s"Writing JSON output to $outputPath")
    ...
}

我注意到你的案例类没有参数。如果您只需要一个JsonOutputFormatAvroOutputFormat的实例,则可以将它们设为案例对象。

trait OutputFormat
case object JsonOutputFormat extends OutputFormat
case object AvroOutputFormat extends OutputFormat

在这种情况下,您可以使用原始代码段,即不使用_:。您也可以考虑制作特质sealed