同样在scaladoc中看到,sets are invariant :(那么当你希望将一个人视为协变时,你会怎么做?
我有一个构造函数对象:
object SimpleGraph {
def apply[ID](vertices: List[AbstractVertex[ID]], edges: Set[AbstractEdge[ID]]) = {
val simpleGraph = new SimpleGraph[ID, AbstractVertex[ID], AbstractEdge[ID]]
vertices.map(simpleGraph.addNode)
edges.map(simpleGraph.addEdge)
simpleGraph
}
}
鉴于不变性,遵守T <: AbstractEdge[ID]
的类型集不会进入我的apply
函数。编译错误建议使用通配符类型,这与我的理解意味着完全绕过类型安全(?)。我自己的解决方案是丑陋的,因为它使用cpu周期和更多的内存来克服不变性:将原型的类型从Set
更改为List
并在列表和集合之间来回转换以获取数据通过
你有更好的建议吗?
谢谢!
答案 0 :(得分:2)
我对此并不十分肯定,因为我目前无法正确测试它,但是不能通过类型参数告诉您应用集合中项目的确切类型吗?
object SimpleGraph {
def apply[ID, EDGE <: AbstractEdge[ID]](vertices: List[AbstractVertex[ID]], edges: Set[EDGE]) = {
val simpleGraph = new SimpleGraph[ID, AbstractVertex[ID], AbstractEdge[ID]]
vertices.foreach(simpleGraph.addNode)
edges.foreach(simpleGraph.addEdge)
simpleGraph
}
}