剥离示例:
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
^
高阶函数尤其是对于理解而言更能解决我的问题。
答案 0 :(得分:1)
将Seq [_]说明中的通配符更改为:
class WithoutUpperBounds[AA[_] <: Seq[_ <: Node], B <: Node](val nodeSeq: AA[B]) extends WithUpperBounds[AA, B] {
答案 1 :(得分:0)
type Set[A] = collection.immutable.Set[A]
通配符会抛弃类型等价,但您可以在不声明任何参数的情况下抽象出任意参数。我的特质现在看起来像:
trait WithUpperBounds[AA[B] <: Set[B], Node, Edge]…