我有一个初学者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中特征使用的理解中的一个问题。任何帮助解决这个问题将非常感激。
答案 0 :(得分:2)
此行上是否出现编译器错误?
samples :+= new Sample(...))
如果是这样,我认为问题是您的Sample
课程实际上并未延长SampleAPI
。
正在发生的事情与Scala中List
类型的contravariant类型参数有关。如果以List[SampleAPI]
开头,然后在该列表中添加Sample
,则需要在列表中包含的类型中找到最小上限以用作新类型参数。如果Sample
是SampleAPI
,那么最低上限只是SampleAPI
,并且List[SampleAPI]
操作会得到:+=
。但是,如果Sample
不而不是SampleAPI
那么这两种类型的最小上限只是Object
,因此编译错误说它是期待Seq[SampleAPI]
但找到了Seq[Object]
。