Добавление элемента в середине scala.collection.immutable.Vector в Java - PullRequest
0 голосов
/ 08 июля 2011

Я пытаюсь использовать Scala immutable.Vector в Java.Кто-нибудь может выложить простой Java-код для этого?

Это то, что я пробовал до сих пор.

  1. Пробовал Vector Builder.
  2. Пробовал Vector.concat(Seq<Traversable <A>>)

Вот пример того, что я пробовал:

Vector<Long> part1= orignal.slice(0, indexOfMid);
Vector<Long> part2 = orignal.slice(indexOfMid, orignal.size());
orignal= part2.appendFront(1L);
Vector <Traversable<Long>> vectorOfTraversables = Vector.empty();
vectorOfTraversables.appendFront(orignal.toTraversable());
vectorOfTraversables.appendFront(part1.toTraversable());
orignal= Vector.concat(vectorOfTraversables.toSeq());

Я получаю следующую ошибку

Exception in thread "main" java.lang.NoSuchMethodError:
scala.collection.immutable.Vector.concat(Lscala/collection/Seq;)Lscala/collection/immutable/Vector;

Есть ли лучший, совершенно другой способ сделать это?Или я где-то ошибаюсь?

Ответы [ 2 ]

2 голосов
/ 08 июля 2011

Это должно работать:

Vector<Long> part1 = original.slice(0, indexOfMid);
Vector<Long> part2 = original.slice(indexOfMid, original.size());
VectorBuilder<Long> builder = new VectorBuilder<Long>();
builder.$plus$plus$eq(part1);
builder.$plus$eq(new Long(100));
builder.$plus$plus$eq(part2);
Vector<Long> result = builder.result();

VectorBuilder предоставляет методы, которые не используют CanBuildFrom или повторяющиеся параметры, так что гораздо проще использовать из Java.

КстатиNoSuchMethodError, вероятно, связано с тем, что concat является методом объекта-компаньона.Импортируйте scala.collection.immutable.Vector$ и попробуйте это:

Vector$.MODULE$.concat(vectorOfTraversables.toSeq());
1 голос
/ 08 июля 2011

Если вы видите NoSuchMethodError или любую другую ошибку, которая происходит от LinkageError , это означает, что ваш код был скомпилирован с другой версией библиотеки, чем в вашем пути к классам.

Это несколько необычно для библиотек Java, но невероятно распространено в Scala, где двоичная совместимость довольно трудно достичь - в первую очередь из-за особенностей.

Убедитесь, что ваш путь к классам во время выполнения содержит ту же версию Scala, что и ваш путь к компиляции, и вы должны, по крайней мере, пойти дальше. *

* РЕДАКТИРОВАТЬ: Но, опять же, вы не будете очень далеко без много боли. Если вам действительно нужно использовать коллекцию Scala из Javaland, я думаю, вам лучше всего написать интерфейс на Java и реализовать его из Scala.

...