1

私はakka俳優と仕事をしています。すべてのアクターreceiveは、のシグネチャを持つメソッドを実装する必要がありPartialFunction[Any, Unit]ます。のような署名とのマッチングに使用する、より厳密な関数を定義したいと思いますPartialFunction[Action, Unit]。ただし、これはコンパイルされません。

class PlayerActor extends Actor with {
  override def receive: Receive = rec

  def rec: PartialFunction[Action, Unit] = {
    case Jump() =>
  }
}

ケースを忘れた場合にコンパイラが警告するように、これを実行したいと思います。

Receiveと定義されているtype Receive = PartialFunction[Any, Unit]


私はそれを次のように手動で行うことになりました:

override def receive = {
  case a: Action => rec(a)
}

キャストすることによっても行うことができます:

override def receive = rec.asInstanceOf[PartialFunction[Any, Unit]]

または暗黙の変換を介して:

implicit def toAnyPartial[T](f: PartialFunction[T, Unit]): PartialFunction[Any, Unit] =
  f.asInstanceOf[PartialFunction[Any, Unit]]
4

3 に答える 3

1

PartialFunction最初の型パラメーターで反変です。これが何を意味するのかを詳しく説明するつもりはありません (書籍、ブログ投稿、SO の質問と回答があります) が、代わりに非常に些細な例を示します。

に渡すことができAnyますreceive。に割り当てることができる場合はrecreceiveに渡すことができることを意味Anyrec、 の型をバイパスしrecます。コンパイラはそれを禁止しています。

于 2012-12-14T16:01:35.803 に答える
1

PartialFunction[Any, Unit]タイプの実装を使用して作成することだけが必要な場合は、PartialFunction[T, Unit]これを試すことができます。

implicit def toPfAny[T](pf: PartialFunction[T, Unit]): PartialFunction[Any, Unit] = {
  object PF { def unapply(a: T): Option[Unit] = pf.lift(a) }
  { case PF(_) => () }
}

使用法:

scala> def impl: PartialFunction[String, Unit] = { case s => println(s) }
impl: PartialFunction[String,Unit]

scala> def receive: PartialFunction[Any, Unit] = impl
receive: PartialFunction[Any,Unit]
于 2012-12-14T16:33:35.730 に答える