我想将类型参数移动到类型成员。
这是有效的起点:
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 答案的例子:
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]
让你知道这无济于事。