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したがって、の型パラメーターを制約する必要があるようです。

2 回目の試行:

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

m(f)

これは falseであるmため、適用時に失敗します。PartialFunction[AnyRef{type A <: X[this.A]},Boolean] <: PartialFunction[X[_],Boolean]

部分関数の定義との適用の両方でコンパイラを実際に満足させるキャストを含まない方法はありますmか?

4

2 に答える 2

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 に答える
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 に答える