3

假设存在以下类型和方法:

trait X[A <: X[A]]

case class C extends X[C]

def m(x: PartialFunction[X[_], Boolean])

我希望能够创建一个 PartialFunction 来传递给m.

第一次尝试是写

val f: PartialFunction[X[_], Boolean] = { 
  case c: C => true
}

m(f)

这失败了type arguments [_$1] do not conform to trait X's type parameter bounds [A <: X[A]]。所以,看来我们必须要约束X的类型参数。

第二次尝试:

val f: PartialFunction[{type A <: X[A]}, Boolean] = { 
  case c: C => true
}

m(f)

这在应用程序上失败,m因为PartialFunction[AnyRef{type A <: X[this.A]},Boolean] <: PartialFunction[X[_],Boolean]是错误的。

有没有什么方法不涉及在偏函数的定义和应用上真正满足编译器的强制转换m

4

2 回答 2

1

不确定这是否是您想要实现的目标,但这是工作顺序:

trait X[A <: X[A]]
case class C extends X[C]
def m[T<:X[T]](x: PartialFunction[X[T], Boolean]) = print("yahoo!")

scala> def f[T<:X[T]]:PartialFunction[X[T], Boolean] = {
     | case c: C => true
     | }
f: [T <: X[T]]=> PartialFunction[X[T],Boolean]

scala> m(f)
yahoo!
于 2014-12-28T23:11:43.433 回答
1

我不确定您到底想要什么,但由于您使用的是存在类型(伪装_语法),因此您可以通过以下方式使其工作:

val f: PartialFunction[X[A] forSome {type A <: X[A]}, Boolean] = {
  case c : C => true
}

这里的_语法不够好,因为您需要为存在类型提供正确的上限。只有使用更明确的forSome语法才能做到这一点。

然而,令我惊讶的是 Scala 接受了这个声明

def m(x: PartialFunction[X[_], Boolean])

首先。它甚至考虑X[_]一个格式良好的类型似乎很奇怪。这是 的缩写X[A] forSome {type A <: Any},它不应该是 的有效应用X,因为它不符合参数边界。

于 2014-12-29T10:27:41.650 回答