scala – 无法将表示类型实现为类型成员
发布时间:2020-12-16 08:55:51 所属栏目:安全 来源:网络整理
导读:虽然在 another question点开头,我遇到了不同的谜语.这是其中之一: 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 t
虽然在
another question点开头,我遇到了不同的谜语.这是其中之一:
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 } ^ 为什么? (也尝试添加自我类型_: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]() ^ 解决方法
我仍然不完全确定你正在寻找什么约束,但这是一种可能性:
trait Sys[S <: Sys[S]] { type Peer <: Sys[Peer] } trait Fenced { type MySys <: Sys[MySys] type Peer = MySys#Peer } def makeFence[S <: Sys[S]] = new Fenced{ type MySys = S } 这使您(并且需要!)访问Fenced中的Peer和原始外部类型.我不确定Fenced是否可以这样做,或者它是否必须在外部类型中抽象. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |