Преобразование типов из любого объекта: сопоставление с образцом и Try () - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть абстрактный класс Scala с методом, который получает значение, тип которого Any.В зависимости от класса, который его расширяет, ожидаемый тип этого значения варьируется.

Давайте рассмотрим пример использования сопоставления с образцом:

abstract class A {
  def operation(input: Any): Any
}

class B extends A {
  // In this class, the input parameter is expected to be a Seq[Any]
  def operation(input: Any): Any = {
    input match {
      case _: Seq[Any] => Option(input.asInstanceOf[Seq[Any]]))
      case _ => None
    }
  }
}

class C extends A {
  // In this class, the input parameter is expected to be a Map[String, Any]
  def operation(input: Any): Any = {
    input match {
      case _: Map[String, Any] => Option(input.asInstanceOf[Map[String, Any]]))
      case _ => None
    }
  }
}

И это реализация, использующая функцию Try():

class B extends A {
  // In this class, the input parameter is expected to be a Seq[Any]
  def operation(input: Any): Any = {
    Try(input.asInstanceOf[Seq[Any]]).toOption
  }
}

class C extends A {
  // In this class, the input parameter is expected to be a Map[String, Any]
  def operation(input: Any): Any = {
    Try(input.asInstanceOf[Map[String, Any]]).toOption
  }
}

Какие из этих опций могут быть лучшими в Scala, а также менее затратными в вычислительном отношении?Есть ли другой способ реализовать эту идею более эффективно?

1 Ответ

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

Ни, по крайней мере, не так, как вы их опубликовали.asInstanceOf - это кодовый запах.Кроме того, Some() предпочтительнее Option().Однако мы можем достичь этого без asInstanceOf, используя правильное сопоставление с шаблоном:

def operation(input: Any): Option[Seq[Any]] = {
  input match {
    case s: Seq[Any] => Some(s)
    case _ => None
  }
}

Что касается эффективности, то подход Try почти наверняка самый медленный, поскольку он потенциально требует вычисления трассировки стека.

Кроме того, вы должны попытаться использовать более конкретные типы, чем Any.

...