尝试查看参数化或抽象类型构造函数作为其上限的Scala类型不匹配错误

时间:2011-03-23 12:42:29

标签: generics scala types

剥离示例:

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
                                   ^

高阶函数尤其是对于理解而言更能解决我的问题。

2 个答案:

答案 0 :(得分:1)

将Seq [_]说明中的通配符更改为:

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

答案 1 :(得分:0)

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

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

通配符会抛弃类型等价,但您可以在不声明任何参数的情况下抽象出任意参数。我的特质现在看起来像:

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