在构造随机图时,我尝试支持2种不同的边线类型
TimestampEdge
DiffusionEdge
每个都扩展了通用Edge类
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应该是TimeStampEdge
或DiffusionEdge
,扩散顶点是所有图模型使用的顶点,并且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
无法将Edge强制转换为TimeStampEdge
或的where类DiffusionEdge
,我认为问题出在我所显示的addEdge
方法中的edge实例化始终是Edge类的缘故。但是我不确定如何在创建E型边的地方制作它。任何有关如何执行此操作的帮助将不胜感激!
调用new Edge(...)
不会创建以E表示的Edge的任何子类,除非E确实表示Edge。将对象从一种类型转换为另一种类型时,Java不会更改其实际类型,更不用说将其转换为通用类型了。为了使类型转换为特定类型起作用,对象本身必须已经是该类型。
如果要创建一个新的E,则可以将其传递给ASupplier<E>
或使用工厂模式正确地创建一个新的E。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句