我有一个简单的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的优雅。
我是否还有其他优雅的解决方案?
答案 0 :(得分:2)
这就是模式匹配的用途。你有什么作品,我在下面编辑过。
format match {
case _: AvroOutputFormat =>
logger.info(s"Writing Avro output to $outputPath")
...
case _: JsonOutputFormat =>
logger.info(s"Writing JSON output to $outputPath")
...
}
我注意到你的案例类没有参数。如果您只需要一个JsonOutputFormat
和AvroOutputFormat
的实例,则可以将它们设为案例对象。
trait OutputFormat
case object JsonOutputFormat extends OutputFormat
case object AvroOutputFormat extends OutputFormat
在这种情况下,您可以使用原始代码段,即不使用_:
。您也可以考虑制作特质sealed
。