Помещение объекта scala.collection.iterator в конструктор класса scala

У меня есть класс Scala:

Rts.scala

class Rts(buffer:Iterator[Tse]) extends Ts
{ //Some methods}

Теперь я пытаюсь поместить список Tse в конструктор вышеупомянутого класса из класса Java:

Tse tse1= new Tse(1285927200000L, 1285928100000L, 0.0);

Tse tse2 = new Tse(1285928100000L, 1285929000000L, 1.0);

Tse tse3= new Tse(1285929000000L, 1285929900000L, 2.0);

Tse tse4 = new Tse(1285929900000L, 1285930800000L, 3.0);

List<Tse> entryList = new ArrayList<Tse>();
entryList.add(tse1);
entryList.add(tse2);
entryList.add(tse3);
entryList.add(tse4);

Iterator<Tse> iterator = entryList.iterator();
Rts rts= new Rts(iterator); //compile time error

Сводка ошибки:

The constructor Rts(Iterator<Tse>) is undefined

Как правильно поместить список в конструктор?

1 ответ

Решение

В Scala scala.collection.Iterator не тот же тип, что и java.util.Iterator, Смотрите также этот вопрос.

Короче, что-то вроде следующего должно работать:

new Rts(scala.collection.JavaConversions$.MODULE$.asScalaIterator(iterator));

(для вызова методов на объектах из Java, см. здесь).

Поскольку это довольно уродливо, лучше вместо этого определить вспомогательный Java API в вашей библиотеке Scala. Например:

class Rts(buffer: Iterator[Tse]) extends Ts {
  // overloaded constructor that can be used from Java
  def this(buffer: java.util.Iterator[Tse]) = this({
    import scala.collection.JavaConverters._
    buffer.asScala
  })
}

И тогда звонок должен работать напрямую:

new Rts(iterator);

В противном случае итератор может использоваться только один раз. Вы уверены, что это то, что вы хотите? Вероятно, было бы лучше, если бы вы использовали другую коллекцию, такую ​​как Seq или же Iterable, Опять же, вы можете найти способы взаимодействия с Java в JavaConverters а также JavaConversions (см. здесь для различия).

Другие вопросы по тегам