gpt4 book ai didi

scala - 缺少抽象类型成员数组的类 list

转载 作者:行者123 更新时间:2023-12-01 12:58:38 26 4
gpt4 key购买 nike

我正在寻找在数组实例化中提供类 list 的建议。我重构了这段代码(编译得很好):

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)
}

失败并显示消息 “找不到元素类型 S#R[A] 的类 list ”

那我该如何解决呢?

最佳答案

你的问题是 Array 的类型参数是不变的,需要一个精确的类型参数。您在 Sys 中定义的 type R 仅提供上限。

您可以通过将 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
}

或者,如果您希望在 Sys 中打开 R[A],您可以通过细化在使用站点指定等式约束,如下所示,

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
}

选择哪一个在很大程度上取决于您的大背景。

关于scala - 缺少抽象类型成员数组的类 list ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8108793/

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