のは、私は、以下の特性のScalaのADT - 文字列からデシリアライズする方法が一般的な方法であり
trait Named {
def name: String
}
と、次の代数的データ型今
sealed trait Animal extends Named
case object Dog extends Animal {
override val name: String = "dog man"
}
case object Cat extends Animal {
override val name: String = "cat man"
}
case object Owl extends Animal {
override val name: String = "I am an owl left in the dark"
}
を持っているとしましょう次の方法で、文字列のインスタンスを動物のADTに逆シリアル化できます。
object Animal {
def apply(name: String): Animal = name match {
case Dog.name => Dog
case Cat.name => Cat
}
}
@oxbow_lakesという彼のanswerの終わりに言及:
は永続値から簡単にインスタンス化することはできません。これも当てはまりますが、 巨大な列挙型(例:すべての通貨)の場合を除き、 これは大きなオーバーヘッドがありません。
新しい値を追加すると、エラーが発生しやすいように非直列化コードに明示的に追加する必要があることがわかります(コンパイラは完全な一致を警告しますが、上記のOwl
とapply
の方法をご覧ください。警告はありませんでした。)
良い方法はありますか?あなたが試みることができる一つのことは、オブジェクトを検索するname
を使用してMap[String,Animal]
を作成するためにそれを使用し、その後、Animal
を拡張するタイプのセットを取得するためにリフレクションを使用することです(ない標準のScalaツールセット、サードパーティ製の1とした場合?)
藤堂、自分の質問に答えます。 2つの投稿に基づく解決策を見つけました: http://stackoverflow.com/questions/25838411/cant-prove-that-singleton-types-are-singleton-types-while-generating-type-class および http: /stackoverflow.com/questions/43650265/implicit-arguments-how-to-encode-in-function-signature 次のようにまとめられています:http://stackoverflow.com/a/43658710/101715 – Yaneeve