返回列表或选项的匹配类型

时间:2016-07-21 04:37:34

标签: scala

如何让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 classtrait设计。感谢。

1 个答案:

答案 0 :(得分:1)

使用Product代替Traversable[T]作为返回类型:

def extractValues[T](o: Ok[T]): Product = o match {

由于您将返回类型声明为Traversable,因此Scala编译器使用Option.option2Iterable隐式转换将Option转换为Traversable这就是您获得List(1)的原因在这两种情况下。

特征Product混合了ListOption,因此您应该获得适当的结果。

相关问题