用于将"Any"类型转换为指定泛型类型参数的 Scala 泛型函数


是否可以

编写一个泛型函数,该函数接受类型为"Any"的值,泛型类型参数为"T",并通过检查传入值的运行时类型返回 Option[T]?

我尝试了 repl (Scala 版本 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_66))

def cast[T](x: Any): Option[T] = x match {
case v: T => Some(v)
case _ =>  Option.empty[T]
}

我收到警告:

 warning: abstract type pattern T is unchecked since it is eliminated by erasure
           case v: T => Some(v)

我如何传入类类型并进行显式类型检查而不是泛型?

附言显然是由于类型擦除,上面的代码爆炸了。示例 repl 交互:

scala> val x :Any = 123                                                                                    
x: Any = 123                                                                                               
scala> cast[Int](x)                                                                                        
res0: Option[Int] = Some(123)                                                                              
scala> cast[String](x)                                                                                     
res1: Option[String] = Some(123)                                                                           
scala> val x :Any = "dfg"                                                                                  
x: Any = dfg                                                                                               
scala> cast[Int](x)                                                                                        
res2: Option[Int] = Some(dfg)                                                                              
scala> cast[Int](x).get                                                                                    
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer                         
  at scala.runtime.BoxesRunTime.unboxToInt(BoxesRunTime.java:101)                                          
  ... 33 elided   
您需要

为运行时类型提供一个ClassTag

def cast[T: ClassTag](x: Any): Option[T] = x match {
  case v: T => Some(v)
  case _ =>  Option.empty[T]
}
println(cast[Int](1))
println(cast[Int]("hello"))

收益 率:

Some(1)
None

最新更新