2014-02-21 6 views
3

Я хочу вызвать следующий метод:Понимание общих методов

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

(Любой, кто знаком с пружинным-данными Neo4j распознает это как метод класса EndResult ).

Я пока не совсем доволен дженериками, и я не понимаю, как назвать этот метод.

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

метод findAll() возвращает Iterable основных Neo4j "узлов", и сцепление с .as(). метод к нему преобразует этот результат в итерабельность другого типа. Если бы я хотел преобразовать его в итерабельность (например) Point объектов, как бы я назвал этот метод?

ответ

4

Параметр container должен быть объектом класса класса, который реализует интерфейс Iterable для типа R. Например:

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

Если Iterable тип 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 extends ArrayList {}' - самый простой способ. Я должен был положить это в ответ, который я только что сделал :) – Bohemian

Смежные вопросы