Границы типа для непримененных параметров типа - PullRequest
2 голосов
/ 16 января 2012

Как указать границы неприменимого параметра типа более высокого порядка, чтобы компилировались следующие компоненты:

trait Declr[Impl[_]]   // need to specify constraints for Impl's type parameter

trait Sys[S <: Sys[S]]

object X extends Declr[X]  // doesn't compile, because S is more strict
trait X[S <: Sys[S]]

Без добавления дополнительных параметров типа в Declr.Обратите внимание, что в решении допускается допустить, что граница параметра Impl равна всегда S <: Sys[S] (т. Е. Это граница для любого типа, который может входить в Declr).

Я думаю, что могу написать ограничение с типом member следующим образом:

trait Declr {
  type Impl[S <: Sys[S]]
}

object X extends Declr {
  type Impl[S <: Sys[S]] = X[S]
}
trait X[S <: Sys[S]]

Но как сделать это как параметр типа (какПереформулировка type Impl очень шумная, и я хочу, чтобы object X был как можно более чистым)?

1 Ответ

4 голосов
/ 16 января 2012

Почему бы не

trait Declr[Impl[S <: Sys[S]]]
trait Sys[ S <: Sys[ S ]]

object X extends Declr[ X ]  
trait X[ S <: Sys[ S ]]
...