2014-02-21 70 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