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

我有以下代码:

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)(我需要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
}

正如Alexey所写,您在使用基元时遇到了一些麻烦。在这种情况下,Scala源代码中使用的技术总是涉及每种原始类型的单独匹配,因此我想没有办法解决。

关于scala - 我们可以将Any与泛型匹配吗? [Scala 2.8],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4859508/

10-13 06:12