귀하의 문제가 Array
는 형식 매개 변수에서 일정되고 있다는 것입니다, 정확한 형식 인수가 필요합니다. type R
의 정의가 Sys
인 경우에만 상한선을 제공합니다. 당신이 Sys
오픈 R[A]
를 떠나 않으려면
당신은 평등
R
에 상한을 대체하여 정의 사이트에서 문제를 해결할 수
,
trait Ref[S <: Sys[S], A]
trait Sys[Self <: Sys[Self]] {
type R[A] = Ref[Self, A] // '=' not '<:'
}
trait Struct[S <: Sys[S], A] {
val arr = new Array[S#R[A]](1) // OK
}
다른 방법으로는 평등 제약 조건을 지정할 수 있습니다 그래서 같은 정제를 통해 이용 사이트,
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
}
큰 선택에 따라 크게 달라집니다.
감사합니다. 나는 암묵적으로 [ClassManifest [...]]로 마지막 접근법을 필요로 할 것이라고 생각한다. –