このパターンは、 の実際のサブタイプをキャプチャできるようにするために使用されます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") }