ISeq
представляет собой интерфейс для seqs, так LazySeq
реализует ISeq
, а также. Тип функции seq
намекает на его возврат как ISeq
.
Звонок seq
на вектор возвратит PersistentVector$ChunkedSeq
, который представляет собой разный вид ленивой последовательности. Это реализация, предназначенная для амортизации затрат на ее создание поэтапно (я думаю, что он оценивает 8 элементов за раз iirc).
Если вы действительно хотите LazySeq
конкретно, вы могли бы сделать
(lazy-cat [1 2 3])
, но это было бы только полезно, чтобы заставить элемент-поэлементную оценки и устранения отрывов поведения.
В Java, это было бы:
// once
Var lazyCat = RT.var("clojure.core", "lazy-cat");
// at use
IPersistentVector vector = ...
ISeq lv = (ISeq) lazyCat.invoke(vector);
Обратите внимание, что это дало бы мне tinglies на самом деле привести результат к LazySeq
поэтому я использовал интерфейс ISeq
в любом случае здесь. Существует no гарантируют, что конкретный класс LazySeq
- это то, что вы фактически получите в любой момент в будущем. Учитывая, что вы так же, от вызова SEQ непосредственно:
// once
Var seq = RT.var("clojure.core", "seq");
// at use
IPersistentVector vector = ...
ISeq lv = (ISeq) seq.invoke(vector);
В общем, это хорошая идея, чтобы всегда вызывать классы Clojure через Варс, полученные от выполнения и только приведение к интерфейсам, никогда не бетону типы. Это значительно снижает вероятность того, что что-то сломается для вас от выпуска до выпуска.
Можете ли вы немного расширить * почему * вам нужен экземпляр LazySeq? Библиотека последовательности Clojure разработана таким образом, что вам не нужно ничего знать о базовой структуре данных. – Alex