Scala 类型不匹配错误尝试将参数化或抽象类型构造函数视为其上限

发布于 2024-10-25 00:01:05 字数 856 浏览 1 评论 0原文

精简示例:

trait WithUpperBounds[AA[_] <: Set[_], Node, Edge] {
    val nodes: AA[Node]
    val edges: AA[Edge]
}

class WithoutUpperBounds[AA[_] <: Set[_], Node, Edge](
    val nodes: AA[Node],
    val edges: AA[Edge]
) extends WithUpperBounds[AA, Node, Edge] {
    val nodes2Set: Set[Node] = nodes
    val edges2Set: Set[Edge] = edges
}

REPL 输出:

scala> :l …/Sandbox.scala
Loading …/Sandbox.scala...
defined trait WithUpperBounds
<console>:10: error: type mismatch;
 found   : AA[Node]
 required: Set[Node]
        val nodes2Set: Set[Node] = nodes
                                   ^
<console>:11: error: type mismatch;
 found   : AA[Edge]
 required: Set[Edge]
        val edges2Set: Set[Edge] = edges
                                   ^

高阶函数,特别是对于理解,使我的问题更加复杂。

Stripped down example:

trait WithUpperBounds[AA[_] <: Set[_], Node, Edge] {
    val nodes: AA[Node]
    val edges: AA[Edge]
}

class WithoutUpperBounds[AA[_] <: Set[_], Node, Edge](
    val nodes: AA[Node],
    val edges: AA[Edge]
) extends WithUpperBounds[AA, Node, Edge] {
    val nodes2Set: Set[Node] = nodes
    val edges2Set: Set[Edge] = edges
}

REPL output:

scala> :l …/Sandbox.scala
Loading …/Sandbox.scala...
defined trait WithUpperBounds
<console>:10: error: type mismatch;
 found   : AA[Node]
 required: Set[Node]
        val nodes2Set: Set[Node] = nodes
                                   ^
<console>:11: error: type mismatch;
 found   : AA[Edge]
 required: Set[Edge]
        val edges2Set: Set[Edge] = edges
                                   ^

Higher-order functions especially for comprehensions compound my issue.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

记忆之渊 2024-11-01 00:01:05

将 Seq[_] 描述中的通配符更改为:

class WithoutUpperBounds[AA[_] <: Seq[_ <: Node], B <: Node](val nodeSeq: AA[B]) extends WithUpperBounds[AA, B] {

Change the wildcard in the Seq[_] description to this:

class WithoutUpperBounds[AA[_] <: Seq[_ <: Node], B <: Node](val nodeSeq: AA[B]) extends WithUpperBounds[AA, B] {
等数载,海棠开 2024-11-01 00:01:05

@thoredge 为我指明了正确的方向。我在 Predef.scala 中找到了解决方案:

type Set[A] = collection.immutable.Set[A]

通配符会丢弃类型等效性,但您可以抽象任何任意参数而不声明它。我的特质现在看起来像:

trait WithUpperBounds[AA[B] <: Set[B], Node, Edge]…

@thoredge pointed me in the right direction. I found the solution in Predef.scala:

type Set[A] = collection.immutable.Set[A]

Wildcards throws away type equivalence but you can instead abstract over any arbitrary parameter without declaring it. My trait now looks like:

trait WithUpperBounds[AA[B] <: Set[B], Node, Edge]…
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文