-1

我有一个初学者 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 中使用特征的理解存在问题。任何帮助弄清楚这一点将不胜感激。

4

1 回答 1

2

编译器错误是否出现在这一行?

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

如果是这样,我认为问题在于您的Sample课程实际上并没有扩展SampleAPI

发生的事情与Scala 中类型的逆变类型参数有关。List如果您以 a 开头List[SampleAPI],然后将 a 添加Sample到该列表中,则它需要找到列表中包含的类型的最小上限以用作新的类型参数。如果Sample是 a SampleAPI,那么最小上界是 justSampleAPI并且您得到 aList[SampleAPI]作为:+=操作的结果。但是,如果Sample不是a那么SampleAPI两种类型的最小上限是 just Object,因此您的编译器错误说它期待 aSeq[SampleAPI]但找到了 a Seq[Object]

于 2012-09-06T16:52:04.050 回答