2012-09-06 61 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

相關問題