通用类型的实例化以支持自定义对象
Instantiation of generic type to support custom objects
在构建随机图时,我试图支持 2 种不同的边类型
TimestampEdge
DiffusionEdge
其中每一个都扩展了通用 Edge class
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
是抽象 class 所有图模型继承自。
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
中,其中 class Edge 无法转换为 TimeStampEdge
或 DiffusionEdge
,我相信问题出在我的实例化上显示的 addEdge
方法中的边数始终是边线 class。但是,我不确定如何在创建 E 型边的地方创建它。非常感谢任何有关如何执行此操作的帮助!
调用 new Edge(...)
不会创建表示为 E 的 Edge 的任何子类,除非 E 确实表示 Edge。 Java 在将对象从一种类型转换为另一种类型时不会更改对象的实际类型,更不用说将其转换为泛型类型了。要转换为特定类型才能起作用,对象本身必须已经是该类型。
如果你想创建一个新的E,也许你可以传递一个Supplier<E>
或者使用工厂模式来正确地创建一个新的E。
在构建随机图时,我试图支持 2 种不同的边类型
TimestampEdge
DiffusionEdge
其中每一个都扩展了通用 Edge class
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
是抽象 class 所有图模型继承自。
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
中,其中 class Edge 无法转换为 TimeStampEdge
或 DiffusionEdge
,我相信问题出在我的实例化上显示的 addEdge
方法中的边数始终是边线 class。但是,我不确定如何在创建 E 型边的地方创建它。非常感谢任何有关如何执行此操作的帮助!
调用 new Edge(...)
不会创建表示为 E 的 Edge 的任何子类,除非 E 确实表示 Edge。 Java 在将对象从一种类型转换为另一种类型时不会更改对象的实际类型,更不用说将其转换为泛型类型了。要转换为特定类型才能起作用,对象本身必须已经是该类型。
如果你想创建一个新的E,也许你可以传递一个Supplier<E>
或者使用工厂模式来正确地创建一个新的E。