我有一个抽象的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的最佳实践,而且计算成本也更低?有没有其他方法可以更有效地实现这个想法?
也没有,至少不是你发布的那些。 asInstanceOf
是一种代码气味。此外,Some()
确实优于Option()
。但是,通过正确使用模式匹配,我们可以在没有asInstanceOf
的情况下实现此目的:
def operation(input: Any): Option[Seq[Any]] = {
input match {
case s: Seq[Any] => Some(s)
case _ => None
}
}
至于效率,Try
方法几乎肯定是最慢的,因为它可能需要计算堆栈跟踪。
此外,您应该尝试使用比Any
更具体的类型。