我想在 Function1 或 PartialFunction 上定义一个加宽函数。
我想这样做是因为我有一个类似于以下的用例:
class A
class B extends A
def foo(fun: Function[B, A]) = {
bar(fun.widen[A])
}
def bar(pf: PartialFunction[A, A]) = ???
如上所示,为了实现这一点,我想到了定义一个加宽函数,如下所示:
implicit class AugmentedFunction[T, U](fun: T => U) {
def widen[T1 >: T]: PartialFunction[T1, U] = { case t: T => fun(t) }
}
但不幸的是,由于擦除,这不起作用。我尝试研究使用 TypeTags,但我似乎无法以令编译器满意的方式表达这一点。
澄清: 当我说它不起作用时,我的意思是当它实际上不应该抛出异常并在 ScalaKata 上的代码片段的特定情况下打印“未定义”时,它会在使用时抛出异常(参见 ScalaKata 代码片段)。
我的问题:
我怎样才能正确解决这个问题?Scalaz 或 Shapeless 中是否已经有我不知道的功能?首先这样做有意义吗?
这是包含所有代码的片段:http ://www.scalakata.com/527bb729e4b0b1a1c4db1a73