2016-02-13 76 views
1

在構建隨機圖我試圖支持2種不同的邊緣類型實例化一般類型以支持自定義的對象

  • TimestampEdge
  • DiffusionEdge

其中每一種延伸的一般邊緣類

public class TimeStampEdge extends Edge<DiffusionVertex,Integer> { 

//timestamp edge specific methods 

} 

public class DiffusionEdge extends Edge<DiffusionVertex,Integer> { 

    public DiffusionEdge(String name, DiffusionVertex v, DiffusionVertex v1) { 
     super(name, v, v1); 
    } 
} 

V是一個自我引用變量使得頂點可保持其鄰居列表,和K只是一個邊緣的一些值有

public class Edge<V extends Vertex<?,V>,K> implements Edges<V,K> { 
    //Generic edge methods and values 
} 

我想要做的是什麼能夠從相同的圖形模型創建兩種邊緣類型的圖形,下面是隨機K樹的示例。其中E應該是TimeStampEdgeDiffusionEdge,擴散頂點是所有圖模型使用的頂點,而GraphClass是所有圖模型繼承的抽象類。

public class KTree<E extends Edge<DiffusionVertex, Integer>> extends GraphClass<DiffusionVertex,E> 
//ktree methods 

    public boolean addEdge(DiffusionVertex v, DiffusionVertex v1){ 
     if(this.findEdgeSet(v,v1).isEmpty()){ 

      v.setDegree(v.getDegree()+1); 
      v1.setDegree(v1.getDegree()+1); 

      E edge = (E) new Edge(v.getLabel() +"-"+v1.getLabel() ,v,v1); 


      this.Edges.put(edge.getHashCode(), edge); 

      return true; 

     }else{ 

      return false; 

     } 
    } 

//more ktree methods 
} 

我一直運行到哪裏java.lang.ClassCastException類邊緣不能轉換爲TimeStampEdgeDiffusionEdge,我相信這個問題來自於我在所示addEdge方法始終是邊緣類的邊緣的實例。不過,我不確定如何使它在創建E型邊緣的地方進行。任何有關如何去做這件事的幫助都將非常感謝!

回答

3

調用new Edge(...)將不會創建表示爲E的Edge的任何子類,除非E確實表示Edge。當你將它從一種類型轉換爲另一種類型時,Java不會改變對象的實際類型,更不用說將其轉換爲泛型類型時的情況。爲了使特定的類型轉換爲工作狀態,對象本身必須已經是該類型。

如果你想創建一個新的E,也許你可以傳遞一個Supplier<E>或使用工廠模式來創建一個新的E正確。

相關問題