首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除PartialFunction输入绑定

如何删除PartialFunction输入绑定
EN

Stack Overflow用户
提问于 2015-05-10 18:22:59
回答 2查看 114关注 0票数 1

有没有办法将PartialFunction[Int,_]转换为PartialFunction[Any,_]

下面的代码引发ClassCastException

代码语言:javascript
复制
val f: PartialFunction[Int, _] = ...
f.asInstanceOf[PartialFunction[Any,Any]].isDefinedAt("a")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-10 22:29:26

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

代码语言:javascript
复制
val g: PartialFunction[Any, Any] = { 
    case x: Int if f isDefinedAt x => f(x)
}

另一种选择是扩展PartialFunction并手动重写applyisDefined。你甚至可以用一个匿名类来完成这个任务。例如:

代码语言:javascript
复制
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.lift,或者PartialFunction.condOpt

代码语言:javascript
复制
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

代码语言:javascript
复制
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])
    }
}
票数 0
EN

Stack Overflow用户

发布于 2015-05-10 18:27:52

将它包装成一个新的部分函数,对于不属于Int类型的输入,该函数是未定义的。

代码语言:javascript
复制
val g: PartialFunction[Any, Any] = { case x: Int if f isDefinedAt x => f(x) }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30155048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档