在scala中绕过Set的不变性

时间:2015-09-24 18:53:45

标签: scala

同样在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并在列表和集合之间来回转换以获取数据通过

你有更好的建议吗?

谢谢!

1 个答案:

答案 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
  }
}