理解泛型方法

3
我想调用以下方法:
<C extends Iterable<R>> C as(Class<C> container)

(任何熟悉spring-data-neo4j的人都会将其识别为EndResult类的一种方法)。

我还不太熟悉泛型,并且不理解如何调用这个方法。

ArrayList<Point> pointlist = neo4jtemplate.findAll(Line.class).as( ?? );

findAll()方法返回一个基本的Neo4j“节点”可迭代对象,将.as() 方法与其链接将其转换为另一种类型的可迭代对象。如果我想将其转换为(例如)Point 对象的可迭代对象,应该如何调用此方法?

1个回答

4

container参数必须是一个实现了类型RIterable接口的类对象。例如:

neo4jtemplate.findAll(Line.class).as(MyClassThatIteratesOverTypeR.class);

如果可迭代类型是Point,可能是这样的:
class PointIterator implements Iterable<Point> {
    // you would have to implement all the method of Iterator
}

或者简单地说:
class PointIterator extends ArrayList<Point> { } // That's all you need

那么:

neo4jtemplate.findAll(Line.class).as(PointIterator.class);

请注意,泛型不允许您创建类型化的文字:

请注意,泛型无法创建类型化的文字:

neo4jtemplate.findAll(Line.class).as(ArrayList<R>.class); // can't do this

很酷,谢谢。如果有人需要的话:你的建议需要我实现hasNext()next()remove(),这会浪费代码,因为我不需要任何特殊功能。所以,我的最终解决方案是在我的自定义迭代器类中简单地扩展ArrayList。非常好用。我会在可以的时候接受你的答案。 - drew moore
1
是的,扩展class PointIterator extends ArrayList<Point> {}是最简单的方法。我应该把它放在答案中,我已经做到了 :) - Bohemian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接