ほんの数日前に同じ懸念がありましたが、sealed traits
に関するドキュメントには何も見つかりませんでした MongoDBでADTをモデリングするため。
結局、私はsealed class
を使用しました 公式で提案されているようにScalaドライバーのgithubリポジトリ
。
(抽象メソッドの定義のために)本当に特性を使用したい場合は、次のようにすることができます:
package example.model
import example.model.adt._
import org.mongodb.scala.bson.ObjectId
import org.mongodb.scala.bson.codecs.Macros._
import org.mongodb.scala.bson.codecs.DEFAULT_CODEC_REGISTRY
import org.bson.codecs.configuration.CodecRegistries.{fromProviders, fromRegistries}
trait MongoModel {
def _id: ObjectId
}
object MongoModel {
val codecRegistery = fromRegisteries(fromProviders(classOf[A]), DEFAULT_CODEC_REGISTRY)
}
これで、AのADTをsealed class
で定義できます。 。
package example.model.adt
import example.model.MongoModel
import org.mongodb.scala.bson.ObjectId
sealed class A
final case class B(_id: ObjectId) extends A with MongoModel
final case class C(_id: ObjectId) extends A with MongoModel
この回答は質問を直接解決するものではありませんが、実行可能な回避策を提供します。このコードは単なる例であることに注意してください。より完全な実装については、このgithubリポジトリ をご覧ください。 。