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.

questionAnswers(4)

yourAnswerToTheQuestion