2011-11-13 4 views
3

배열 인스턴스화에 클래스 매니페스트를 제공하는 것이 좋습니다. 이것에추상 형식 멤버 배열에 대한 누락 된 클래스 매니페스트

trait Ref[A] 
trait Struct[A] { 
    val arr = new Array[Ref[A]](1) 
} 

:

trait Ref[S <: Sys[S], A] 
trait Sys[Self <: Sys[Self]] { 
    type R[A] <: Ref[Self, A] 
} 

trait Struct[S <: Sys[S], A] { 
    val arr = new Array[S#R[A]](1) 
} 

이 메시지 나는이 문제를 해결 얼마나 그래서 "cannot find class manifest for element type S#R[A]"

실패 내가 (잘 컴파일)이 코드를 리팩토링했다?

답변

2

귀하의 문제가 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 
} 

큰 선택에 따라 크게 달라집니다.

+0

감사합니다. 나는 암묵적으로 [ClassManifest [...]]로 마지막 접근법을 필요로 할 것이라고 생각한다. –

2

나는 간단한 간접을 포함 하나 개의 솔루션으로 올 수 :

trait Sys[Self <: Sys[Self]] { 
    type R[A] <: Ref[Self, A] 
    def newRefArray[A](size: Int): Array[Self#R[A]] 
} 

trait Struct[S <: Sys[S], A] { 
    def sys: S 
    val arr = sys.newRefArray[A](1) 
} 
관련 문제