【发布时间】:2017-04-25 12:19:04
【问题描述】:
假设我有:
sealed trait Data
final case class TextData() extends Data
final case class ImageData() extends Data
final case class MetaData[D <: Data](data: D) extends Data
我想对 Data 对象进行模式匹配。我已经定义了:
def getDataTypeName(data: Data): String ={
data match {
case TextData()=>"text"
case ImageData()=>"image"
//MetaData(MetaData(_))=>"metaMeta1" //a
case _:MetaData[MetaData[_]]=>"metaMeta2" //b
//case MetaData(data:Data)=>"meta"+ getDataTypeName(data) //c
//MetaData(TextData(_))=>"metaMeta1" //d
case MetaData(_)=>"meta"
}
}
我希望能够查看我的数据是元元数据、元文本数据等。
线a给我一个错误,说:
构造函数不能被实例化为期望的类型;成立 : inst$A$A.MetaData[D] 需要:A$A115.this.Data 案例 MetaData(MetaData(_))=>"metaMeta1"
我希望有类似a 的东西。或者像c 这样的行也很好。
我也试过b。这会产生一些警告:
非变量类型参数 A$A115.this.MetaData[] in 类型模式 A$A115.this.MetaData[A$A115.this.MetaData[]] 是 未经检查,因为它被擦除消除 案例 :MetaData[MetaData[]]=>"metaMeta" ^
我收到了MetaData[_]s 的警告。我的理解是,在类型擦除后,上述模式被简化为 _,这与我的测试结果一致。
因此我想知道是否有办法匹配MetaMetaData、MetaTextData、MetaMetaMetaData 等。
或者,我的设计是否以不应该使用的方式使用密封类?你会建议什么替代设计?
【问题讨论】:
-
我假设匹配元数据,然后再次匹配以检查内部类不是您理想的解决方案吗?
data match { case Metadata(x) => x match { ... } } -
我想我也会很高兴。事实上,我确实尝试过做类似的事情(c 行),但语法不正确。
标签: scala types pattern-matching