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

时间:2016-02-13 00:32:14

标签: java object generics inheritance instantiation

在构建随机图时,我试图支持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,扩散顶点是用于所有图模型的顶点,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边缘的地方做任何帮助。如何去做这件事会非常感激!

1 个答案:

答案 0 :(得分:3)

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

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