Scala: вернуть один из нескольких предопределенных классов дел - PullRequest
0 голосов
/ 07 сентября 2018

у нас есть около 7-8 классов, определенных как показано ниже:

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

Но все они определены в отдельной библиотеке, и мы импортируем их как банку. В моем коде я работаю над функцией, которая может обрабатывать несколько таких классов, и один из них будет возвращен. Есть ли способ, которым я могу определить свою функцию или вид оболочки, чтобы вернуть один из этих предопределенных классов case?

Большое спасибо за ответ.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Вот пример класса контейнера, который может делать то, что вы хотите.Это предполагает, что существуют уже существующие классы A и B:

// 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))

. Должно быть понятно, как это можно расширить.

0 голосов
/ 07 сентября 2018

Возможно, я неправильно понял ваш вопрос, но разве это не сработает с использованием scala.Either ? Выглядит некрасиво, но что-то вроде этого должно работать:

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

Или вы можете определить общий интерфейс / базовый класс, который реализуют / расширяют ваши классы дел.

...