2016-01-07 36 views
0

我有一個階等級:把scala.collection.iterator的對象是Scala類的構造函數

Rts.scala

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

現在我試圖把謝列表的構造從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.collection.Iteratorjava.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); 

否則,迭代只能使用一次。你確定這就是你想要的嗎?如果您使用其他收集品如SeqIterable,可能會更好。再次,您可以在JavaConvertersJavaConversions(請參閱here中的差異)中找到與Java進行互操作的方法。

+0

您可以使用scala.collection.JavaConversions.asScalaIterator,它稍微不太難看。 – bdew