为了返回数据库插入的状态和键,我创建了以下结构:
sealed trait InsertResult[+I] extends Product with Serializable
object InsertResult {
case class Created[+I](insertedId: I) extends InsertResult[I]
case object DuplicateKey extends InsertResult[Nothing]
}
类型参数I
是创建的密钥的类型(例如UUID
)。如果插入成功,则返回Created[I]
;如果出现重复键错误,则返回DuplicateKey
对象。
这样可行,但由于数据库添加的元数据多于密钥,因此我希望将I
替换为Entity[I, T]
,其中I
仍然是密钥类型,而T
}表示插入对象的类型(基本上是InsertResult[Entity[I, T]]
)。但是,我在执行此操作时遇到了麻烦,只需替换type参数就会给参数insertedId
带来错误(I
并且T
无法解析。)
将I
替换为Entity[I, T]
时,如何查看类型和方法签名?
答案 0 :(得分:0)
这对你的用例来说不够吗?
case class Entity[I, T](id: I, obj: T)
sealed trait InsertResult[I, T] extends Product with Serializable
object InsertResult {
case class Created[I, T](entity: Entity[I, T]) extends InsertResult[I, T]
case object DuplicateKey extends InsertResult[Nothing, Nothing]
}
答案 1 :(得分:0)
package com.example
object Answer extends App {
case class Entity[I, T](id:I, obj:T)
sealed trait InsertResult extends Product with Serializable {}
object InsertResult {
case class Created[I, T](entity:Entity[I, T]) extends InsertResult
case object DuplicateKey extends InsertResult
}
object Storage {
var data = Map.empty[Any, Any]
def insert[I, T](entity:Entity[I, T]):InsertResult =
data.get(entity.id) match {
case Some(_) => InsertResult.DuplicateKey
case None =>
data += entity.id -> entity.obj
InsertResult.Created(entity)
}
}
val entities = Seq(Entity(1, "foo"), Entity(2, "bar"), Entity(1, "foobar"))
entities map Storage.insert foreach println
}