2014-02-21 45 views
3

我想打电话给下面的方法:了解泛型方法

<C extends Iterable<R>> C as(Class<C> container) 

(任何人都熟悉的弹簧数据的Neo4j会认识到这一点为EndResult 类的方法)。

我对泛型还不太满意,但我不明白如何调用此方法。

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

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

回答

4

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

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 
+0

很酷,谢谢。如果它帮助其他人:你的建议需要我执行'hasNext()','next()'和'remove()',这是浪费代码,因为我不需要任何特殊的功能。所以,我最终的解决方案是在我的自定义迭代器类中简单地扩展ArrayList。奇迹般有效。我会尽我所能接受你的答案。 – drewmoore

+1

是的,扩展'class PointIterator扩展ArrayList {}'是最简单的方法。我应该把它放在答案中,我刚刚做了:) – Bohemian