如何定义添加到Seq的特征?

时间:2012-09-06 16:10:19

标签: scala

我有一个初学者Scala问题。我有一个类,Sample扩展了特征SampleAPI。现在我正在尝试使用seq构建一系列Sample实例。我会看起来像这样:

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

这给了我以下编译器错误:“类型不匹配;找到:需要Seq [java.lang.Object]:Seq [se.uu.medsci.queue.setup.SampleAPI]”

所以我试过了:

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

而是抛出运行时异常,说Sample不能对SampleAPI造成麻烦。我想这归结为我对Scala中特征使用的理解中的一个问题。任何帮助解决这个问题将非常感激。

1 个答案:

答案 0 :(得分:2)

此行上是否出现编译器错误?

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

如果是这样,我认为问题是您的Sample课程实际上并未延长SampleAPI

正在发生的事情与Scala中List类型的contravariant类型参数有关。如果以List[SampleAPI]开头,然后在该列表中添加Sample,则需要在列表中包含的类型中找到最小上限以用作新类型参数。如果SampleSampleAPI,那么最低上限只是SampleAPI,并且List[SampleAPI]操作会得到:+=。但是,如果Sample 而不是SampleAPI那么这两种类型的最小上限只是Object,因此编译错误说它是期待Seq[SampleAPI]但找到了Seq[Object]