为了减少代码重复,我替换了这段代码

    ArrayList<Vertex> allVertice = new ArrayList<>(hypergraph.getVertices());

    System.out.println(allVertice.size());
    //hypergraph.getVerticebyType();
    ArrayList<ImageVertex> allImVetice = new ArrayList<>();
    ArrayList<TagVertex> allTagVetice =  new ArrayList<>();

    ArrayList<LocationVertex> allLocVetice = new ArrayList<>();

    for (Vertex vertex : allVertice) {
        if (vertex instanceof ImageVertex)

            allImVetice.add((ImageVertex)vertex);

        else if (vertex instanceof TagVertex)

            allTagVetice.add((TagVertex)vertex);

        else if (vertex instanceof LocationVertex)

            allLocVetice.add((LocationVertex)vertex);
    }


通过这种方法

  public <T extends Vertex<?> > ArrayList<T> getVerticebyType( ) {

        ArrayList<T> array = new ArrayList<T>();

        for (Vertex<?> vertex : this.getAllVertice()) {
            if (vertex instanceof Vertex<?>)
                array.add((T) vertex);

    }
        return array;

}


但是当我测试这条指令时

ArrayList<ImageVertex>=hyperGraph.getVerticebyType();

它返回所有顶点,无论它们的类型!

有什么问题以及如何解决?

最佳答案

等效的字面意思是传入Class<T>(假设T本身不是通用类型)并使用Class.cast(可能与Class.isInstance一起使用)。但是,使用instanceof表示您做错了事。反射,数量级更是如此。

10-02 03:07
查看更多