繁体   English   中英

如何删除PartialFunction输入绑定

[英]How to remove PartialFunction input bound

有什么方法可以将PartialFunction[Int,_]转换为PartialFunction[Any,_]吗?

以下代码引发ClassCastException

val f: PartialFunction[Int, _] = ...
f.asInstanceOf[PartialFunction[Any,Any]].isDefinedAt("a")

将其包装在一个新的部分函数中,该函数对于非Int类型的输入未定义:

val g: PartialFunction[Any, Any] = { case x: Int if f isDefinedAt x => f(x) }

您可以将部分函数包装在新的PartialFunction ,如建议的那样:

val g: PartialFunction[Any, Any] = { 
    case x: Int if f isDefinedAt x => f(x)
}

另一个选择是扩展PartialFunction并手动覆盖applyisDefined 您甚至可以使用匿名类进行此操作。 例如:

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.unliftPartialFunction.liftPartialFunction.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使用所需的方法来丰富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])
    }
}

暂无
暂无

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

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