为了减少代码重复,我替换了下面的代码
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();
它返回所有顶点,而不管它们的类型!
问题是什么?如何解决?
发布于 2013-05-01 00:01:00
字面上的等价物是传入一个Class<T> (假设T本身不是泛型类型)并使用Class.cast (可能与Class.isInstance一起使用)。然而,使用instanceof表明你做错了什么;反射,更多的是数量级。
发布于 2013-04-30 23:51:30
将这一行:vertex instanceof Vertex<?> (测试顶点是否为顶点)更改为:vertex instanceof T (这一行检查顶点是否为T类型)
还要确保您熟悉Oracle教程和泛型限制:Oracle Generics Tutorial
https://stackoverflow.com/questions/16303938
复制相似问题