有没有办法将PartialFunction[Int,_]转换为PartialFunction[Any,_]?
下面的代码引发ClassCastException
val f: PartialFunction[Int, _] = ...
f.asInstanceOf[PartialFunction[Any,Any]].isDefinedAt("a")发布于 2015-05-10 22:29:26
您可以将部分函数包装在新的PartialFunction中,正如已经建议的那样:
val g: PartialFunction[Any, Any] = {
case x: Int if f isDefinedAt x => f(x)
}另一种选择是扩展PartialFunction并手动重写apply和isDefined。你甚至可以用一个匿名类来完成这个任务。例如:
new PartialFunction[Any, Any] {
def apply(x: Any) = f(x.asInstanceOf[Int])
def isDefinedAt(x: Any) = x.isInstanceOf[Int] && f.isDefinedAt(x.asInstanceOf[Int])
}您还可以使用Function.unlift和PartialFunction.lift,或者PartialFunction.condOpt。
import Function._
val g = unlift[Any, Any] {
case x: Int => f.lift(x)
case _ => None
}
//Alternative with condOpt
import PartialFunction._
val g = unlift(condOpt(_ : Any) { case x: Int => f.lift(x) }.flatten)如果这种情况足够常见,甚至可以使用所需的方法充实PartialFunction:
implicit class RichPartialFunction(val pf: PartialFunction[Int, Any]) extends AnyVal {
implicit def withAnyDomain = new PartialFunction[Any, Any] {
def apply(x: Any) = pf(x.asInstanceOf[Int])
def isDefinedAt(x: Any) = x.isInstanceOf[Int] && pf.isDefinedAt(x.asInstanceOf[Int])
}
}发布于 2015-05-10 18:27:52
将它包装成一个新的部分函数,对于不属于Int类型的输入,该函数是未定义的。
val g: PartialFunction[Any, Any] = { case x: Int if f isDefinedAt x => f(x) }https://stackoverflow.com/questions/30155048
复制相似问题