Ваша проблема в том, что Array
, инвариантный в параметре типа, требует точного аргумента типа.Ваше определение type R
в Sys
предусматривает только верхнюю границу.
Вы можете устранить проблему на сайте определения, заменив верхнюю границу R
равенством
* 1008.*
В качестве альтернативы, если вы предпочитаете оставить R[A]
открытым в Sys
, вы можете указать ограничение равенства на сайте использования с помощью уточнения, например, так:
trait Ref[S <: Sys[S], A]
trait Sys[Self <: Sys[Self]] {
type R[A] <: Ref[Self, A] // Back to an upper bound
}
trait Struct[S <: Sys[S] { type R[A] = Ref[S, A] }, A] {
// ^^^^^^^^^^^^^^^^^^^^^^^^^
// Assert the equality via a refinement
val arr = new Array[S#R[A]](1) // OK
}
Если вы можетеНе указывайте type R
любым из этих способов, тогда у вас нет другого выбора, кроме как предоставить ClassManifest самостоятельно,
trait Ref[S <: Sys[S], A]
trait Sys[Self <: Sys[Self]] {
type R[A] <: Ref[Self, A]
}
trait Struct[S <: Sys[S], A] {
implicit val rM : ClassManifest[S#R[A]] // Provided manifest later ...
val arr = new Array[S#R[A]](1) // OK
}
class SomeSys extends Sys[SomeSys] {
type R[A] = Ref[SomeSys, A]
}
val s = new Struct[SomeSys, Int] {
val rM = implicitly[ClassManifest[SomeSys#R[Int]]]
// ^^^^^^^^^^^^^^
// Precise type known here
}
Какой из них выбрать, очень сильно зависит от вашего более широкого контекста.