Выберите тип класса динамически в Scala - PullRequest
1 голос
/ 10 июня 2019

Я хочу сериализовать и десериализовать классы дел в JSON, и после десериализации их, основываясь на их подтипе, я бы хотел обработать их по-другому.Примерно так:

  sealed trait Salutation
  case class Hello(name: String)
  case class Greetings(name: String)
  case class HeyThere(name: String)

  trait Handler[A] {
    def greet(salutation: A)
  }

  implicit val helloSalutation: Handler[Hello] =
    new Handler[Hello] {
      def greet(salutation: Hello) = println(s"Hello, ${salutation.name}")
    }
  implicit val greetingsSalutation: Handler[Greetings] =
    new Handler[Greetings] {
      def greet(salutation: Greetings) = println("Greetings.")
    }
  implicit val heyThereSalutation: Handler[HeyThere] =
    new Handler[HeyThere] {
      def greet(salutation: HeyThere) = println("Hey there!")
    }

  val action = deserializeSalutationFromJson[Salutation](jsonStringFromSomewhere) 
  // NOTE: _action_ will be of the correct subtype, e.g. Greeting

  /* TODO val handler = select which handler to use based the type of action */

  handler.greet(action)

Что такое хороший шаблон в Scala для выполнения этого выбора на основе динамического типа из JSON?

...