のは、私が持っているとしましょう:スカラ:パターン「コンクリート」の場合のために、一般的なケースクラスを一致
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
私は、パターンマッチデータオブジェクトをしたいです。私が定義されています:
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"
}
}
を、私は私のデータがメタメタデータであるかどうかを確認できるようにしたい、メタのTextDataは、など ラインa
を言って、私にエラーを与える:
コンストラクタ予想される型にインスタンス化することはできません。見つかった: インスト$ A $ A.MetaData [D]必要:$ A115.this.Dataケース メタデータ(メタデータ(_))=> "metaMeta1"
私は何か似たラインを持っていることを好むだろうa
。代わりに、行c
のような何かがいいかもしれません。
私はまた、ラインb
を試しました。
非可変型引数A $ A115.this.MetaData []で タイプのパターンA $ A115.this.MetaData [A $ A115.this.MetaData []]:この1は、いくつかの警告を生成し、それは消去 場合によって排除されているのでチェックしない です:メタデータ[メタデータ[]] => "metaMeta" ^
私は両方のMetaData[_]s
ため、この警告が表示されます。私の理解は、上記のパターンは、私のテスト結果と一致するタイプ消去後に_に減少するということです。
私はそのためMetaMetaData
に対してマッチングの方法があるかどうかを知りたい、MetaTextData
、MetaMetaMetaData
など
代わりに、彼らは使用すべきではない方法で密封されたクラスを使用して、私のデザインですか!どのような代替設計をお勧めしますか?
私は、メタデータに対してその試合を想定して、内部クラスを確認するために再び一致すると、あなたの理想的なソリューションではありませんか?データ一致{@}メタデータ(x)=> x一致{...}} '' ' – pedrorijo91
私もそれに満足していると思います。実際に私は何か似たようなことをしようとしましたが(行c)、構文を正しく取得できませんでした。 – ShS