实例化泛型类型以支持自定义对象



在构建随机图时,我正在尝试支持 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
}

我一直遇到无法将类 Edge 转换为 TimeStampEdgeDiffusionEdgejava.lang.ClassCastException,我相信问题来自我在所示的 addEdge 方法中对边缘的实例化始终属于 Edge 类。但是,我不确定如何在创建 E 型边缘的位置制作它。有关如何执行此操作的任何帮助将不胜感激!

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

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

最新更新