首页 文章

scala中图类中的推断类型参数错误

提问于
浏览
0

我尝试在scala中实现以下图形类:case类NodeT

case class Node[T](i:T)

class Graph[N<:Node[T], +T](someNodes:Set[N], val edges:Set[(N,N)]) {
  val nodes: Set[N] = someNodes ++ edges.map(_._1) ++ edges.map(_._2)

  def addVortex(node:N)=new Graph(someNodes, edges)//just use someNodes instead of nodes + node
}

但是有一个错误说

推断类型参数[N,Nothing]不符合类Graph的类型参数bounds [N <:Node [T],T]

为什么会这样?

2 回答

  • 2

    我将澄清@ chengpohi的答案

    您的代码中存在两个问题 .

    小问题:由于 Graph 构造函数中未提及 T 类型,因此应直接指定它:

    def addVertex(node: N) = new Graph[N, T](someNodes + node, edges)
    

    更大的问题:正如@chengpohi所提到的类型 TGraph 中不能同时存在并且在 Node 中同时不变 . 所以你应该纠正其中一个定义

    case class Node[+T](i: T)
    

    要么

    class Graph[N <: Node[T], T]
    

    原因是:提及类型参数 T 作为协变意味着,例如, Graph[Node[String], String]Graph[Node[String], AnyRef] 的子类型,但这会产生矛盾,通过 Node[String] 不是 Node[AnyRef] 的子类型,而它应该根据您的定义 .

  • 1

    如果要在 Graph[N<:Node[T], +T] 中启用 variant 类型 T ,则需要启用 Node Tvariant .

    case class Node[+T](i:T)
    

相关问题