私は、驚くほど多くの抽象化を備えた ubercool アプリケーションを構築中です。ここで、過度に設計された EntityGetService を設計します。
私が最初に欲しいのは、多くの抽象型です。次のように言ってみましょう:
trait EntityGetService[ID, ENTITY, CONTAINER] {
def get(id: ID): CONTAINER
}
ここでの CONTAINER は、要求されたエンティティを含む (または含まない) 何かのタイプです。Option[ENTITY] と非常によく似ています。しかし、私が望む 2 番目のことは、CONTAINER も Future[ENTITY] にすることができることです。
だから本当に私はこのような特性を書きたいです:
trait EntityGetService[ID, ENTITY, CONTAINER <: Wrapper[ENTITY]] {
def get(id: ID): CONTAINER
}
次のように指定します。
trait EntitySyncGetService[Long, Entity, Option[Entity]] {
def get(id: Long): Option[Entity]
}
trait EntityAsyncGetService[Long, Entity, Future[Entity]] {
def get(id: Long): Future[Entity]
}
Option と Future に何かを再拡張または混合せずにこれを行う方法はありますか?
Option と Future には少し共通点があるようです (両方のコンテナー)。それはモナドに関連するものですか?
それとも、これは私の不眠症の産物ですか?