来自Any对象的类型转换:模式匹配vs Try()

问题描述 投票:0回答:1

我有一个抽象的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的最佳实践,而且计算成本也更低?有没有其他方法可以更有效地实现这个想法?

scala casting type-conversion pattern-matching try-catch
1个回答
2
投票

也没有,至少不是你发布的那些。 asInstanceOf是一种代码气味。此外,Some()确实优于Option()。但是,通过正确使用模式匹配,我们可以在没有asInstanceOf的情况下实现此目的:

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

至于效率,Try方法几乎肯定是最慢的,因为它可能需要计算堆栈跟踪。

此外,您应该尝试使用比Any更具体的类型。

© www.soinside.com 2019 - 2024. All rights reserved.