2

特性を考えるとT

trait T {
  def v: Int
  def +(t: T): T
}

次のクラスA

case class A(v: Int) extends T {
  def +(a: A) = A(v + a.v)
}

の有効なサブタイプではありませんT。の実装は、 type の要素のみを受け入れるのに対し、 の署名ではすべての実装が typeのオブジェクトだけでなく、 type のオブジェクトを受け入れることができる必要があるA.+ため、制限が厳しすぎます。これまでのところ、とても合理的です。AT.+TA

の実装を制限的にしたい場合は、次のようにandTの宣言を変更できます。TA

trait T[This <: T[This]] {
  def v: Int
  def +(t: This): This
}

case class A(v: Int) extends T[A] {
  def +(a: A) = A(v + a.v)
}

これは明らかに型シグネチャを爆破します。

Tの実装が独自の型のオブジェクトと互換性があるだけでよいことを宣言する別の方法はありますか?

1st EDIT以下のLandeiの回答への返信:

自己型は実際に現在の署名を短縮しますTが、発生する他の署名を短縮しません。

trait C[D <: T[D], S] { self: S =>
  def +(perm: D): S
  def matches(other: S): Boolean
}
4

2 に答える 2

1

タイプメンバーでそれを行うことができます。あなたがここで求めている「ショート」のブランドが正確にはわかりません. 多少の冗長性はありますが、一方で、大きなブラケットの節約をもたらす型パラメーターはありません。

trait TT {
  type This <: TT
  def v: Int
  def +(t: This): This
}
case class AA(v: Int) extends TT {
  type This = AA
  def +(a: This) = AA(v + a.v)
}
于 2010-12-16T10:50:04.333 に答える
1

自己型を使用できます。

trait T[S] {
  self:S => 
  def v: Int
  def +(t: S): S
}

case class A(v: Int) extends T[A] {
  def +(a: A) = A(v + a.v)
}
于 2010-12-14T11:55:35.340 に答える