Scala:返回多个预定义案例类之一

时间:2018-09-07 07:17:26

标签: scala scala-collections

我们定义了大约7-8个案例类,如下所示:

case class DocumentReference(res: Option[Seq[Resource]],
                     name: String,
                     description: Option[String],
                     reference:Option[Seq[Reference]])

但是所有这些都是在单独的库中定义的,我们将它们作为jar导入。 在我的代码中,我正在使用一个可以处理多个这种case类的函数,并且将返回其中一种。 有没有一种方法可以定义我的函数或包装器类型以返回那些预定义的案例类之一?

非常感谢您的答复。

2 个答案:

答案 0 :(得分:0)

这是一个容器类的示例,可以完成您想要的操作。假设存在预先存在的类AB

// Container trait
trait Container {
  type T
  def value: T
}

// Container for each contained type
class ContainerA(a: A) extends Container {
  type T = A
  val value = a
}

class ContainerB(b: B) extends Container {
  type T = B
  val value = b
}

// Companion class to make it easy to create containers
object Container {
  def apply(a: A) = new ContainerA(a)
  def apply(b: B) = new ContainerB(b)
}

// Implicit conversion to and from the Container type
implicit def aToContainer(a: A): Container = Container(a)
implicit def bToContainer(b: B): Container = Container(b)

implicit def aFromContainer(container: ContainerA): A = container.value
implicit def bFromContainer(container: ContainerB): B = container.value

// Sample function using Container
def fun(x: Seq[Container]): Container = {
  x.head match {
    case a: ContainerA => a
    case b: ContainerB => b
  }
}

// Example usage
val a: A = ...
val b: B = ...

fun(List(Container(a), Container(b)))
fun(List[Container](a, b))
fun(List(a, b))

应该清楚如何扩展它。

答案 1 :(得分:-1)

我可能误解了您的问题,但是使用scala.Either不能正常工作吗? 看起来很丑,但类似的东西应该可以工作:

 def myMethod : Either[Class1, Either[Class2, Either[...]]] = {...}

或者,您可以定义案例类实现/扩展的公共接口/基类。