2012-09-06 28 views
-1

我有一个初学者斯卡拉的问题。我有一个类Sample,它扩展了特征SampleAPI。现在我试图使用seq构建一个Sample实例序列。我会是这个样子:如何定义添加到Seq的特征?

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

这给了我以下编译器错误:“类型不匹配;实测值:序号[java.lang.Object继承]要求:序号[se.uu.medsci.queue.setup。 SampleAPI]”

所以,我想:

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

这反而会引发一个运行时异常,说样品不能韧皮到SampleAPI。我想这是我在理解Scala中使用特征时遇到的一个问题。任何帮助搞清楚这一点将不胜感激。

+0

不能重现你的编译器错误,用' trait SampleAPI工作得很好; class Sample扩展SampleAPI; var sample:Seq [SampleAPI] = Seq(); (i < - 1至10){ 样本:+ =新样本() }' –

+0

您应该真正发布所有相关代码并指定错误对应的行。再现错误的最小示例将是理想的。 – DaoWen

+0

你是对的@KimStebel它的工作原理,如果你延伸Sample然后写我,但错过了我自己的代码。 – Johan

回答

2

编译器错误在这一行上出现吗?

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

如果是的话,我认为这个问题是您Sample类实际上并没有延伸SampleAPI

发生了什么与Scala中的List类型的contravariant类型参数有关。如果以List[SampleAPI]开头,然后将Sample添加到该列表中,则需要查找列表中包含的类型的最小上限以用作新的类型参数。如果SampleSampleAPI,那么最小上限仅为SampleAPI,并且由于:+=操作而得到List[SampleAPI]。但是,如果Sample而不是 a SampleAPI那么这两种类型的最小上限就是Object,因此,您的编译器错误说它期望Seq[SampleAPI]但发现Seq[Object]

+0

谢谢。你是绝对正确的。我忘了扩展样本SampleAPI,这是当天结束的错误之一。 – Johan

+0

我很高兴你现在能够正常工作。我希望我对这个错误的解释是有道理的,这样下次你就能更容易理解编译器在抱怨什么了! – DaoWen

+0

你的解释很棒。谢谢。 – Johan

相关问题