在思考另一个问题时,我遇到了似乎相关的不同谜语。这是其中之一:
trait Sys[S <: Sys[S]] {
type Peer <: Sys[Peer]
}
trait Fenced {
type Peer <: Sys[Peer]
}
def makeFence[S <: Sys[S]] = new Fenced { type Peer = S#Peer }
其中错误如下:
error: overriding type Peer in trait Fenced with bounds >: Nothing <: Sys[this.Peer];
type Peer has incompatible type
def makeFence[S <: Sys[S]] = new Fenced { type Peer = S#Peer }
^
为什么?(也尝试将 self-type 添加_:S =>
到Sys
,没关系)
虽然 Rex 的回答使构造Fenced
对象成为可能,但它并没有真正解决我在使用类型投影 ( S#Peer
) 时表示类型字符丢失的问题。我提出了另一种提出更严格限制的方案;我认为这是核心问题:
trait Test[S <: Sys[S]] {
def make[T <: Sys[T]](): Unit
make[S#Peer]()
}
error: type arguments [S#Peer] do not conform to method make's type
parameter bounds [T <: Sys[T]]
make[S#Peer]()
^