저는 walking around a problem입니다. 유형 프로젝션과 추상 유형에 새로운 이상한 문제가 발견되었습니다. 트랜잭션을 생성하는 시스템이 있고 브리지 할 피어 시스템이 있다고 가정 해보십시오.스칼라가 연결된 (투영) 유형 멤버를 연결할 때 관련 유형의 트랙을 잃습니다
trait Txn[S <: Sys[S]] {
def peer: S#Peer#Tx
def newID(): S#ID
def newVar[A](id: S#ID, init: A): S#Var[A]
}
trait Sys[S <: Sys[S]] {
type Tx <: Txn[S]
type Peer <: Sys[Peer] // parallel system
type Var[A]
type ID
}
내가 직접 시스템을 사용할 수 있습니다 : 다음은 나에게 좋아 보인다
def indirectDoesnt[S <: Sys[S]](implicit tx: S#Tx): Unit = {
val p = tx.peer
val id = p.newID()
val v = p.newVar(id, 0) // what the **** - id is not compatible??
}
error: type mismatch;
found : id.type (with underlying type S#Peer#ID)
required: _30129.Peer#ID where val _30129: S
val v = p.newVar(id, 0)
^
:
def directWorks[S <: Sys[S]](implicit tx: S#Tx): Unit = {
val id = tx.newID()
val v = tx.newVar(id, 0)
}
하지만를 어떻게 든 거래의 peer
방법은 다음에서 볼 수 있듯이, 결함이
나는 영리 해지고 그걸 해결하려고했다.
def clever[S <: Sys[S]](implicit tx: S#Tx): Unit = {
def directWorks[S <: Sys[S]](implicit tx: S#Tx): Unit = {
val id = tx.newID()
val v = tx.newVar(id, 0)
}
directWorks(tx.peer)
}
...하지만 그 잘못에 대한 자세한 단서를주고, 너무, 실패
error: inferred type arguments [S#Peer] do not conform to method
directWorks's type parameter bounds [S <: Sys[S]]
directWorks(tx.peer)
^
그것은 모두가 하나 def peer: S#Peer#Tx
문제를 소개하고, 또는 제안으로 사용하지 않을 때 type Peer <: Sys[Peer]
이 문제입니다 (가능성을?) 매개 변수을 입력하고 구성원을 입력하십시오.
그리고 매우 깨지기입니다. 예를 들어'tx.system'은'val'이어야하고'def'는 될 수없고'S # Peer'는'Sys'이어야합니다. 더 구체적인 sys가 될 수 없습니다. 당신은 어디서나 작은 것을 바꿀 수 있습니다. 나는 이미 모든 것을 일하도록 노력하면서 시간을 보냈다. –