繁体   English   中英

我们可以将Any与一般类型匹配吗? [Scala 2.8]

[英]Can we match Any to a generic type? [Scala 2.8]

如果之前已经回答,请指出我正确的链接。

我有这个代码:

def getResult(a:Any):Any = a

def getAnswer[T](i:Int) = {
  val result = getResult(i)
  result match {
    case t:T => Some(t)
    case _ => None
  }
}

这给了我一个unchecked warning ,一切都与T匹配。 例如,当我得到getAnswer[Int](2) ,我得到Some(2) (如预期的那样)。 但是,如果我确实得到了getAnswer[String](2) ,我也得到了Some(2)不期望的Some(2) (我需要None )。

有没有办法解决类型擦除并以某种方式让getAnswer正常工作(即,当且仅当结果是T类型时,返回Some(result) )?

提前致谢。

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
}

正如阿列克谢所写,你在原语方面遇到了一些麻烦。 在这种情况下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

暂无
暂无

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

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