gpt4 book ai didi

scala - 无法将表示类型实现为类型成员

转载 作者:行者123 更新时间:2023-12-03 02:03:11 26 4
gpt4 key购买 nike

同时我的头又裂开 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 }

这使您(并且需要!)可以访问 PeerFenced 中的原始外部类型。我不确定 Fenced 是否可以这样做,或者它是否必须跨外部类型进行抽象。

关于scala - 无法将表示类型实现为类型成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12589193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com