「推論された型引数が型パラメーターの境界に準拠していません」というメッセージが表示される理由がわかりません。最初に、いくつかのクラス (CS01 と CS02 など) で実装できる CS というトレイトを定義しました。
trait CS[+T <: CS[T]] {
this: T =>
def add: T
def remove: T
}
class CS01 extends CS[CS01] {
def add: CS01 = new CS01
def remove: CS01 = new CS01
}
class CS02 extends CS[CS02] {
def add: CS02 = new CS02
def remove: CS02 = new CS02
}
アイデアは、CS01 と CS02 を呼び出すとき、add
またはremove
CS01 と CS02 で実装された型を保持することです。次に、特性 CS に準拠するすべてのクラスで実行できる操作を定義したいと思います。次に、という名前のトレイトを定義しましたExec
(2 つの非常に単純なクラスの例とExec01
トレイトExec02
の mixinを使用Exec
):
trait Exec {
def exec[U <: CS[U]](x: U): U
}
class Exec01 extends Exec {
def exec[U <: CS[U]](x: U): U = x.add
}
class Exec02 extends Exec {
def exec[U <: CS[U]](x: U): U = x.remove
}
CS
繰り返しますが、トレイトを混合するクラスの実装された型を保持する必要があります。そのため、exec は でパラメータ化されてい[U <: CS[U]]
ます。
最後に、それに対する操作を有効にして、 traitに続く操作を実行できるようにするCS
trait を mixin する必要があります。Executable
Exec
trait Executable[T <: CS[T]] {
this: T =>
def execute(e: Exec): T = e.exec(this)
}
ただし、コンパイルしようとすると、次のエラーが発生します。
error: inferred type arguments [this.Executable[T] with T] do not conform to method exec's type parameter bounds [U <: this.CS[U]]
def execute(e: Exec): T = e.exec(this)
^
混合するクラスは、バインドされているため、 CS トレイトの mixin の制約を持つExecutable
型でなければならないため、よくわかりません。では、なぜ型パラメーター bound に準拠しないのでしょうか?T
trait Executable[T <: CS[T]]
this
U <: CS[U]