我尝试在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 回答
我将澄清@ chengpohi的答案
您的代码中存在两个问题 .
小问题:由于
Graph
构造函数中未提及T
类型,因此应直接指定它:更大的问题:正如@chengpohi所提到的类型
T
在Graph
中不能同时存在并且在Node
中同时不变 . 所以你应该纠正其中一个定义要么
原因是:提及类型参数
T
作为协变意味着,例如,Graph[Node[String], String]
是Graph[Node[String], AnyRef]
的子类型,但这会产生矛盾,通过Node[String]
不是Node[AnyRef]
的子类型,而它应该根据您的定义 .如果要在
Graph[N<:Node[T], +T]
中启用variant
类型T
,则需要启用Node
T
为variant
.