型パラメーターを型メンバーに移動したいと思います。
これは機能する出発点です:
trait Sys[S <: Sys[S]] {
type Tx
type Id <: Identifier[S#Tx]
}
trait Identifier[Tx] {
def dispose()(implicit tx: Tx): Unit
}
trait Test[S <: Sys[S]] {
def id: S#Id
def dispose()(implicit tx: S#Tx) {
id.dispose()
}
}
私を悩ませているのは、[S <: Sys[S]]
ライブラリ全体で型パラメーターを持ち歩いていることです。だから私が考えていたのはこれです:
trait Sys {
type S = this.type // ?
type Tx
type Id <: Identifier[S#Tx]
}
trait Identifier[Tx] {
def dispose()(implicit tx: Tx): Unit
}
trait Test[S <: Sys] {
def id: S#Id
def dispose()(implicit tx: S#Tx) {
id.dispose()
}
}
これは失敗します...S#Tx
そして、S#Id
どういうわけか切り離されました:
error: could not find implicit value for parameter tx: _9.Tx
id.dispose()
^
それを機能させるトリックや変更はありますか?
編集:明確にするために、私は主にタイプを修正して機能させることを望んでS
いSys
ます。私の場合、パス依存型を使用すると多くの問題があります。pedrofuria と Owen の回答を反映した例を 1 つだけ挙げると、次のようになります。
trait Foo[S <: Sys] {
val s: S
def id: s.Id
def dispose()(implicit tx: s.Tx) {
id.dispose()
}
}
trait Bar[S <: Sys] {
val s: S
def id: s.Id
def foo: Foo[S]
def dispose()(implicit tx: s.Tx) {
foo.dispose()
id.dispose()
}
}
<console>:27: error: could not find implicit value for parameter tx: _106.s.Tx
foo.dispose()
^
def foo: Foo[s.type]
これがどこにも通じないという考えをあなたに与えるためにそれを作ってみてください.