別の質問に頭を悩ませている間、私は関連しているように見えるさまざまななぞなぞに出くわしました。これはそれらの1つです:
trait Sys[S <: Sys[S]] {
type Peer <: Sys[Peer]
}
trait Fenced {
type Peer <: Sys[Peer]
}
def makeFence[S <: Sys[S]] = new Fenced { type Peer = S#Peer }
エラーは次のとおりです。
error: overriding type Peer in trait Fenced with bounds >: Nothing <: Sys[this.Peer];
type Peer has incompatible type
def makeFence[S <: Sys[S]] = new Fenced { type Peer = S#Peer }
^
なんで?(セルフタイプ_:S =>
をに追加しようとしましSys
たが、問題ではありませんでした)
Rexの答えはFenced
オブジェクトを構築することを可能にしますが、タイププロジェクション()を使用するときに表現タイプの文字が失われるという問題を実際には解決しませんS#Peer
。私は、より厳しい制約を課す別のシナリオを考え出しました。これが中心的な問題だと思います。
trait Test[S <: Sys[S]] {
def make[T <: Sys[T]](): Unit
make[S#Peer]()
}
error: type arguments [S#Peer] do not conform to method make's type
parameter bounds [T <: Sys[T]]
make[S#Peer]()
^