2

私は、LiftのMapperおよびRecordフレームワークの標準パターンのように見えるものに戸惑っています。

trait Mapper[A<:Mapper[A]] extends BaseMapper {
  self: A =>
  type MapperType = A

Mapperトレイトのtypeパラメーターに関してはどういう意味ですか?MapperのパラメータであるタイプAは、Mapper [A]のサブクラスである必要がありますが、どうすればそれが可能であるか、またはこの定義の意味がわからない可能性があります。

4

1 に答える 1

2

このパターンは、 の実際のサブタイプをキャプチャできるようにするために使用されますMapper。これは、メソッドでその正確なタイプの引数を受け入れるのに役立ちます。

伝統的に、その制約を宣言することはできません:

scala> trait A { def f(other: A): A  }
defined trait A

scala> class B extends A { def f(other: B): B = sys.error("TODO") }
<console>:11: error: class B needs to be abstract, 
since method f in trait A of type (other: A)A is not defined
(Note that A does not match B)
   class B extends A { def f(other: B): B = sys.error("TODO") }

正確なタイプにアクセスできる場合は、次のことができます。

scala> trait A[T <: A[T]] { def f(other: T): T  }
defined trait A

scala> class B extends A[B] { def f(other: B): B = sys.error("TODO") }
defined class B

これは、境界型メンバーを介しても可能であることに注意してください。

 trait A { type T <: A; def f(other: T): T }
 class B extends A { type T <: B; def f(other: T): T = sys.error("TODO") }
于 2012-09-13T22:23:16.540 に答える