У меня есть абстрактный класс 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, а также менее затратными в вычислительном отношении?Есть ли другой способ реализовать эту идею более эффективно?