2

f-bounded 型パラメータを使用するときに表示されるカスタム エクストラクタに問題があります。以下の作品:

trait Bar

object Model {
  object Foo {
    def unapply[A <: Bar](foo: Foo[A]): Option[Foo[A]] = Some(foo)
  }
  trait Foo[A <: Bar] extends Model[A]
}
trait Model[A <: Bar]

object View {
  def apply[A <: Bar](model: Model[A]): View[A] = model match {
    case Model.Foo(peer) => new Foo(peer)
  }  
  class Foo[A <: Bar](val peer: Model.Foo[A]) extends View[A]
}
trait View[A <: Bar]

Barしかし、が f-bounded の場合は壊れます。

trait Bar[B <: Bar[B]]

object Model {
  object Foo {
    def unapply[A <: Bar[A]](foo: Foo[A]): Option[Foo[A]] = Some(foo)
  }
  trait Foo[A <: Bar[A]] extends Model[A]
}
trait Model[A <: Bar[A]]

object View {
  def apply[A <: Bar[A]](model: Model[A]): View[A] = model match {
    case Model.Foo(peer) => new Foo(peer)
  }  
  class Foo[A <: Bar[A]](val peer: Model.Foo[A]) extends View[A]
}
trait View[A <: Bar[A]]

このエラーが発生します:

<console>:12: error: inferred type arguments [A] do not conform to method unapply's 
  type parameter bounds [A <: Bar[A]]
           case Model.Foo(peer) => new Foo(peer)
                      ^
<console>:12: error: type mismatch;
 found   : Model.Foo[A(in method unapply)]
 required: Model.Foo[A(in method apply)]
           case Model.Foo(peer) => new Foo(peer)
                                           ^

問題は、unapplyの戻り値の型が でOption[+A]あり、 A が不変ではないことだと思います。これがこの問題の原因ですか?そして、どうすればこれを回避できますか?

4

1 に答える 1

0

機能するメソッドを作成できるかどうかには答えunapplyていませんが、Scala 2.10 のパターン マッチャーは、少なくとも不変型パラメーターを使用したキャスト ベースのパターン マッチについて文句を言うことはありません。

object View {
  def apply[A <: Bar[A]](model: Model[A]): View[A] = model match {
    case peer: Model.Foo[A] => new Foo(peer) // yippie, no problem having `[A]` here
  }  
  class Foo[A <: Bar[A]](val peer: Model.Foo[A]) extends View[A]
}
trait View[A <: Bar[A]]
于 2013-03-29T16:08:14.123 に答える