Помещение объекта 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
(см. здесь для различия).