由于Gilles给出的ticket #967的原因,您不能直接进行此操作。有问题的结构是在结构类型中的方法定义的裸参数位置上出现外部定义的类型参数A.
但是,我们可以通过消除有问题的情况来逼近期望的结果,以支持内部类型参数,并且类型约束与应用该方法的任何点处的类型约束强制它等于原始参数类型A.
要做到这一点,你必须修改你试图从结构上捕获方法的签名的一般形式(注意:伪如下),
def method(x : <<your arg type>>) : <<your result type>>
到
def method[T](x : T)(implicit ev : T =:= <<your arg type>>) : <<your result type>>
对于您的特定情况,我们需要类似以下内容,
object O {
def apply[T](i : T)(implicit ev : T =:= Int) : Boolean = i % 2 == 0
}
implicit def apply2Fct[A,B](applier: { def apply[T](a: T)(implicit ev : T =:= A): B }) = {
new Function[A,B] { def apply(a: A): B = applier(a) }
}
样本REPL会话,
scala> implicit def apply2Fct[A,B](applier: { def apply[T](a: T)(implicit ev : T =:= A): B }) = {
| new Function[A,B] { def apply(a: A): B = applier(a) }
| }
apply2Fct: [A, B](applier: AnyRef{def apply[T](a: T)(implicit ev: =:=[T,A]): B})java.lang.Object with (A) => B
scala> object O {
| def apply[T](i : T)(implicit ev : T =:= Int) : Boolean = i % 2 == 0
| }
defined module O
scala> O(23)
res0: Boolean = false
scala> O(24)
res1: Boolean = true
scala> val f: Int => Boolean = O
f: (Int) => Boolean = <function1>
scala> f(23)
res2: Boolean = false
scala> f(24)
res3: Boolean = true
如果“val f = O apply _”在上下文中对你有用,那么这就是要走的路。但是这不是对你的问题的回答,而是作为避免回答它的一种方式......并且这不是更糟糕的。 – 2011-05-09 11:11:59
不错,'1至10过滤器(O apply _)'适用于我,虽然_Miles_答案更复杂,但我不能更改'对象O'的代码。 – 2011-05-09 11:17:19