-1

初心者のScalaの質問があります。トレイト SampleAPI を拡張する Sample クラスがあります。今、seq を使用して Sample インスタンスのシーケンスを構築しようとしています。私は次のようになります。

var samples: Seq[SampleAPI] = Seq()
for(...) {
    samples :+= new Sample(...))
}

これにより、次のコンパイラ エラーが表示されます。

だから私は試しました:

samples :+= (new Sample(sampleName, this, illuminaXMLReportReader)).asInstanceOf[SampleAPI]

代わりに、Sample を SampleAPI に接続できないことを示す実行時例外をスローします。これは、Scala でのトレイトの使用に関する私の理解の問題に帰着すると思います。これを理解するための助けをいただければ幸いです。

4

1 に答える 1

2

この行でコンパイラ エラーが発生していますか?

samples :+= new Sample(...))

もしそうなら、問題はあなたのSampleクラスが実際に拡張されていないことだと思いますSampleAPI

起こっていることは、Scala の型の反変型パラメーターに関係しています。Lista で開始し、そのリストにList[SampleAPI]a を追加する場合Sample、リストに含まれる型の最小上限を見つけて、新しい型パラメーターとして使用する必要があります。Sampleが a の場合SampleAPI、最小上限はちょうどであり、操作の結果としてSampleAPIa が得られます。ただし、 がではない場合、2 つの型の最小上限はちょうどであるため、コンパイラ エラーは、 を期待していたが を見つけたということです。List[SampleAPI]:+=SampleSampleAPIObjectSeq[SampleAPI]Seq[Object]

于 2012-09-06T16:52:04.050 に答える