Scala 将 Any 强制转换为 Option[T]

cla*_*lay 2 casting scala

就像是:

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

或者:

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

这是一个好主意吗?是否有等效的标准库?

为什么会出现以下 Scala 编译器警告以及如何解决:

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

pam*_*amu 7

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

import scala.reflect.ClassTag

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

Scala REPL

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

scala> cast[Int]("scala")
res3: Option[Int] = None
Run Code Online (Sandbox Code Playgroud)

  • 现在,尝试`cast[List[String]](List[Int](1, 2, 3))`。 (7认同)