我想要的是在同一个集合中保留相似但不同的类型。目前,我正在使用多态(代码简化):
trait Item
case class DoubleItem(id: String, value: Double) extends Item
case class StringItem(id: String, value: String) extends Item
case class BooleanItem(id: String, value: Boolean) extends Item
然后可以创建Seq[Item]
并添加三种类型的实例。
我不喜欢的是冗余。通常我会使用泛型Item[A]
,但从我的理解来看,这消除了使用单个集合的可能性(因为A
中的Seq[Item[A]]
必须是具体类型。)< / p>
有更好的方法吗?
(顺便说一句:我想避免使用HList实现或类似的增加复杂性的东西)。
答案 0 :(得分:4)
由于Item
中的value
是协变的,您可以这样做:
case class Item[+A](id: String, value: A)
// example usage
val seq: Seq[Item[Any]] = Seq(Item("foo", 1), Item("bar", true))
def findBoolean(in: Seq[Item[Any]]): Option[Boolean] = in.collectFirst {
case Item(_, b: Boolean) => b
}
assert(findBoolean(seq) == Some(true))