繁体   English   中英

Scala泛型函数将“ Any”类型转换为指定的泛型类型参数

[英]scala generic function to convert “Any” type to specified generic type argument

是否可以编写一个接受“ Any”类型的值和一个泛型类型参数“ T”并通过检查传入的值的运行时类型返回Option [T]的泛型函数?

我在repl中尝试过(Scala 2.11.7版(Java HotSpot(TM)64位服务器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)

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

PS显然由于类型擦除而使以上代码炸毁。 样本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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM