Scala强制转换为选项[T]

时间:2017-03-01 18:49:32

标签: scala casting

类似的东西:

  def cast[T](o: Any): Option[T] = o match {
    case v: T => Some(v)
    case _ => None
  }

或:

  def cast[T](c: Class[T], o: Any): Option[T] = o match {
    case v: T => Some(v)
    case _ => None
  }

这是个好主意吗?是否有标准库相当于?

为什么我会得到以及如何解决以下Scala编译器警告:

Warning:(7, 13) abstract type pattern T is unchecked since it is eliminated by erasure
    case v: T => Some(v)

1 个答案:

答案 0 :(得分:3)

使用class标签。类型信息在运行期间丢失。因此,您需要提供可以使用类标记完成的类型信息。

import scala.reflect.ClassTag

def cast[T: ClassTag](o: Any): Option[T] = o match {
 case v: T => Some(v)
 case _ => None
}

Scala REPL

scala> cast[String]("hello")
res2: Option[String] = Some(hello)

scala> cast[Int]("scala")
res3: Option[Int] = None