我有一個類的對象,其要麼有一個ID類型或其他:鏈接類型在斯卡拉
sealed trait ItemId
case class NumericId(id: Int) extends ItemId
case class StringId(id: String) extends ItemId
sealed trait Item {
def id: ItemId
}
case class ItemWithNumericId(id: NumericId) extends Item
case class ItemWithStringId(id: StringId) extends Item
我想創建某種服務來檢索項的接口:
trait ItemService[IdType <: ItemId, ItemType <: Item] {
def get(id: IdType): ItemType
}
如何鏈接ItemId
類型與Item
類型把一個約束上ItemService
秒到不容許這樣的:
class SillyItemService extends ItemService[NumericId, ItemWithStringId] {
def get(id: NumericId): ItemWithStringId = ???
}
我已經意識到我可以添加泛型類型的Item
類:
sealed trait ItemId
case class NumericId(id: Int) extends ItemId
case class StringId(id: String) extends ItemId
sealed trait Item[Id <: ItemId] {
def id: Id
}
case class ItemWithNumericId(id: NumericId) extends Item[NumericId]
case class ItemWithStringId(id: StringId) extends Item[StringId]
trait ItemService[IdType <: ItemId, ItemType <: Item[IdType]] {
def get(id: IdType): ItemType
}
這是確定的,但它的超級冗長。理想情況下,該服務只會有一個通用類型。
非常感謝任何回答/輸入。
這是非常好的。 ItemService的實現具有我想要的約束,並且可以用最少的樣板代碼來聲明它們。謝謝! –