F-ограниченная квантификация через член типа вместо параметра типа?
Я хотел бы переместить параметр типа в член типа.
Это отправная точка, которая работает:
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
заставить это работать. В моем случае существуют многочисленные проблемы с использованием зависимых от пути типов. Чтобы привести только один пример, который отражает ответы педрофурии и Оуэна:
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]
чтобы дать вам представление, что это ни к чему не приведет.