Scala:类似但不同类型的集合

时间:2015-12-15 21:22:52

标签: scala oop generics polymorphism

我想要的是在同一个集合中保留相似但不同的类型。目前,我正在使用多态(代码简化):

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实现或类似的增加复杂性的东西)。

1 个答案:

答案 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))