我想将变量动态地转换为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
}
}
给了我类型错误。
我应该如何重写此代码?
答案 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
}
}
这里有两个重要的限制:
OptionCast.apply[List[Int]](List("a"))
,它将返回Some(List("a"))
。为了解决这个问题,你必须绕过类型擦除。AnyVal
课程都会被装箱,因此您必须检查java.lang.Integer
以抓住Int
,依此类推。