如果之前已经回答,请指出我正确的链接.
我有这个代码:
def getResult(a:Any):Any = a
def getAnswer[T](i:Int) = {
val result = getResult(i)
result match {
case t:T => Some(t)
case _ => None
}
}
Run Code Online (Sandbox Code Playgroud)
这给了我一个unchecked warning和所有匹配T.例如,当我这样做时getAnswer[Int](2),我得到了Some(2)(正如预期的那样).但是,如果我这样做getAnswer[String](2),我也会得到Some(2)预期的(我需要None).
有没有办法解决类型擦除并以某种方式getAnswer正常工作(即,Some(result)当且仅当结果是类型时返回T)?
提前致谢.
def getAnswer[T](i:Any)(implicit m:Manifest[T]) = i match {
case t:Int if m.erasure == classOf[Int] => Some(t)
case t:Double if m.erasure == classOf[Double] => Some(t)
//... other Primitives
case t if m.erasure.isInstance(t) => Some(t) //this matches AnyRefs
case _ => None
}
Run Code Online (Sandbox Code Playgroud)
正如阿列克谢所写,你在原语方面遇到了一些麻烦.在这种情况下Scala源中使用的技术总是涉及每个基本类型的单独匹配,所以我想没有办法解决.
这有一些限制(T必须是类而不是基本类型;如果T是通用的,则忽略参数).
def getAnswer[T](i:AnyRef)(implicit m:ClassManifest[T]) = {
val result = getResult(i)
if (result.getClass == m.erasure) Some(result.asInstanceOf[T]) else None
}
> getAnswer[java.lang.Integer](2.asInstanceOf[AnyRef])
res4: Option[java.lang.Integer] = Some(2)
getAnswer[String](2.asInstanceOf[AnyRef])
res1: Option[String] = None
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
644 次 |
| 最近记录: |