如何让extractValues
返回其中包含的正确类型?
trait Ok[T]
case class OkSingle[U](value: Option[U]) extends Ok[U]
case class OkList[U](value: List[U]) extends Ok[U]
def extractValues[T](o: Ok[T]): Traversable[T] = o match {
case OkList(l) => l
case OkSingle(v) => v
}
extractValues(OkSingle(Option(1))) // 1
extractValues(OkList(List(1))) // 2
(1)和(2)返回List(1)
。我希望(1)返回Some(1)
。也许我必须重新定义整个case class
和trait
设计。感谢。
答案 0 :(得分:1)
使用Product
代替Traversable[T]
作为返回类型:
def extractValues[T](o: Ok[T]): Product = o match {
由于您将返回类型声明为Traversable
,因此Scala编译器使用Option.option2Iterable
隐式转换将Option
转换为Traversable
这就是您获得List(1)
的原因在这两种情况下。
特征Product
混合了List
和Option
,因此您应该获得适当的结果。