0

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

    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();

它返回所有顶点,不管它们的类型!

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

4

2 回答 2

1

字面上的等价物是传递 a Class<T>in (假设T它本身不是泛型类型)并使用Class.cast(可能与Class.isInstance)。但是 usinginstanceof表明您做错了;反射,数量级更多。

于 2013-04-30T16:01:00.433 回答
0

将此行:( vertex instanceof Vertex<?>测试顶点是否为顶点)更改为:( vertex instanceof T此行检查顶点是否为 T 类型)

还要确保您熟悉 Oracle 教程和泛型限制:Oracle 泛型教程

于 2013-04-30T15:51:29.850 回答