如何动态地将变量转换为Option

时间:2013-12-12 21:19:10

标签: scala dynamic-cast

我想将变量动态地转换为Option[T]。语义是:如果变量x匹配T类型,则强制转换应返回Some(x),否则应返回None。使用单一地图调用比使用伴随isInstanceOf[T]的{​​{1}}或构建怪异案例开关更清晰。

我曾尝试过以下简单的代码

asInstanceOf[T]

但它实际上忽略了类型:object OptionCast { def apply[T](source : Any) : Option[T] = source match { case s : T => Some(s) case _ => None } } 给了我类型错误。

我应该如何重写此代码?

1 个答案:

答案 0 :(得分:4)

您的代码的问题是T被删除 - 字节码中的方法没有类型参数,因此T被删除为Object,因此对于所有内容都是如此。

这有效,有一些限制:

import scala.reflect.ClassTag
object OptionCast {
  def apply[T : ClassTag](source : Any) : Option[T] = source match {
    case s : T => Some(s)
    case _ => None
  }
}

这里有两个重要的限制:

  1. 它无法检查类型参数,因为类型参数被擦除是运行时。这意味着您可以致电OptionCast.apply[List[Int]](List("a")),它将返回Some(List("a"))。为了解决这个问题,你必须绕过类型擦除。
  2. 任何AnyVal课程都会被装箱,因此您必须检查java.lang.Integer以抓住Int,依此类推。