gpt4 book ai didi

java - 通用类型的实例化以支持自定义对象

转载 作者:行者123 更新时间:2023-11-29 04:51:05 24 4
gpt4 key购买 nike

在构建随机图时,我试图支持 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 应该是 TimeStampEdgeDiffusionEdge,diffusion vertex 是用于所有图模型的顶点,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 无法转换为 TimeStampEdgeDiffusionEdge,我相信问题来了从我在显示的 addEdge 方法中的边实例化来看,它始终属于 Edge 类。但是,我不确定如何在我创建 E 型边的地方创建它。非常感谢任何有关如何执行此操作的帮助!

最佳答案

调用 new Edge(...)不会创建表示为 E 的 Edge 的任何子类,除非 E 确实表示 Edge。当您将对象从一种类型转换为另一种类型时,Java 不会更改对象的实际类型,更不用说将其转换为泛型类型了。要转换为特定类型才能起作用,对象本身必须已经是该类型。

如果你想创建一个新的 E,也许你可以给它传递一个 Supplier<E>或使用工厂模式适本地创建一个新的 E。

关于java - 通用类型的实例化以支持自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35374563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com