将 scala.collection.iterator 的对象放入 Scala class 构造函数
Putting object of scala.collection.iterator to the scala class constructor
我有一个 scala class:
Rts.scala
class Rts(buffer:Iterator[Tse]) extends Ts
{ //Some methods}
现在我正在尝试将 Tse 列表放入上述 class 的构造函数中 java class:
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
将列表放入构造函数的正确方法是什么?
Scala 的 scala.collection.Iterator
与 java.util.Iterator
不是同一类型。另见 this question.
简而言之,像下面这样的东西应该可以工作:
new Rts(scala.collection.JavaConversions$.MODULE$.asScalaIterator(iterator));
(用于调用来自 Java、see here 的对象的方法)。
因为这很难看,最好在你的 Scala 库中定义一个辅助的 Java API。例如:
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
,可能会更好。同样,您可以在 JavaConverters
和 JavaConversions
中找到与 Java 互操作的方法(请参阅 here 了解差异)。
我有一个 scala class:
Rts.scala
class Rts(buffer:Iterator[Tse]) extends Ts
{ //Some methods}
现在我正在尝试将 Tse 列表放入上述 class 的构造函数中 java class:
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
将列表放入构造函数的正确方法是什么?
Scala 的 scala.collection.Iterator
与 java.util.Iterator
不是同一类型。另见 this question.
简而言之,像下面这样的东西应该可以工作:
new Rts(scala.collection.JavaConversions$.MODULE$.asScalaIterator(iterator));
(用于调用来自 Java、see here 的对象的方法)。
因为这很难看,最好在你的 Scala 库中定义一个辅助的 Java API。例如:
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
,可能会更好。同样,您可以在 JavaConverters
和 JavaConversions
中找到与 Java 互操作的方法(请参阅 here 了解差异)。