私の頭をanother questionに割いている間、私はさまざまな謎を抱いていました。これはそのうちの一つです:表現型を型メンバーとして実装できません
次のようにエラーがある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 }
^
はなぜ?レックスの答えはFenced
オブジェクトを構築することが可能となりますが
(また、Sys
に自己型_:S =>
を追加しようとした問題ではありませんでした)、それは本当に表現型の文字で、私が持っている問題を解決しませんタイププロジェクション(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]()
^
私は基本的な問題は '形質A [B <:Sys [B]]'(これは問題ありません)と '形質A {タイプB <:Sys [B]}すべてのトラブル)。しかし、私は実際に型メンバーで作業する必要があります、私は私のケースでは型パラメータを導入することはできません。 –
あなたは何を達成しようとしていますか? 「S#ピア」は「S」からの「ピア」であるが、「フェンス」は、(サーフェスレベルの)非互換性を生成する「S」ではなく「ピア」であることをピアに望んでいる。論理的に互換性がないかどうかは、型をシンプルなエイリアスまたは所有権のステートメントとして表示するかどうかによって決まります。残念なことに、これに関してScalaは完全に一貫していません。 「Fenced」には「Sys」型の型があると言うだけですか? –
@RexKerr - その意図がはっきりしない場合は申し訳ありません。リンクされた質問は全体の文脈を与える。基本的に、私が必要と思うものは、 'S <:Sys [S] '以外の追加情報なしで、外部システムを渡すことができるように、外部システムのタイプメンバーのみを使用して、他のピアシステムを完全に埋め込むことができます。私はここでタイプの予測の限界にぶつかっています。問題は、外側のシステムの消費者の中で同輩のタイプを復活させることは不可能であると言ってこれを説明しようとします。 –