Kwantyfikacja ograniczona przez element typu zamiast parametru typu?
Chciałbym przenieść parametr typu do elementu typu.
To jest punkt wyjścia, który działa:
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()
}
}
Irytuje mnie to, że noszę parametr typu[S <: Sys[S]]
w moich całych bibliotekach. Tak więc myślałem o tym:
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()
}
}
Które zawodzi ...S#Tx
iS#Id
stał się jakoś oderwany:
error: could not find implicit value for parameter tx: _9.Tx
id.dispose()
^
Jakieś sztuczki lub zmiany, które sprawiają, że działa?
EDYTOWAĆ : Aby wyjaśnić, mam nadzieję przede wszystkim naprawić ten typS
wSys
aby to działało. W moim przypadku występują liczne problemy związane z typami zależnymi od ścieżki. Aby podać tylko jeden przykład, który odzwierciedla odpowiedzi pedrofurii i Owen:
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()
^
Spróbuj to zrobićdef foo: Foo[s.type]
dać ci pomysł, że to prowadzi donikąd.