2016-08-23 51 views
0

我是相對較新的編程和享受使用Scala來教自己。我遇到了一個問題,我似乎無法將我的頭圍繞。表達式的類型scala.collection.Set [scala.Predef.String]不符合期望的類型scala.Predef.Set [scala.Predef.String]

這是我正在努力的代碼片段。所有使用的地圖是mutable.Map [字符串,任何]

def CreateCompleteVoterSet(): Set[String] = 

{

val firstSet = concedeVoterMap.keySet.diff(voterMap.keySet) 
val secondSet = emoteVoterMap.keySet.diff(voterMap.keySet) 
val thirdSet = speedVoterMap.keySet.diff(voterMap.keySet) 
var finalSet = voterMap.keySet ++ firstSet ++ secondSet ++ thirdSet 

return finalSet 

}

它給我的錯誤是:類型scala.collection.Set的表達[斯卡拉.Predef.String]不符合預期的類型scala.Predef.Set [scala.Predef.String]

我確定我可以找到某種方法強制它到相同的類型,可能toSet() ,但是我對這個錯誤感到困惑是。有人能告訴我一些關於錯誤發生的原因,並指出我正確的方向來解決它的安全方法嗎?

+0

我想知道是否返回finalSet.toSet'會有所幫助。 – ryan

回答

3

由於Set沒有導入,因此Set[String]表示scala.Predef.Setscala.Predef._自動導入到所有Scala文件中)。這是scala.collection.immutable.Set的別名。但keySet方法scala.collection.mutable.Map返回一個scala.collection.Set,這是一個超類型scala.collection.immutable.Set(和scala.collection.mutable.Set,這是不真正相關的問題)。結合scala.collection.Set++仍然會給你一個scala.collection.Set

簡單的解決方案是將返回類型更改爲scala.collection.Set,除非您實際上因其他原因需要scala.collection.immutable.Set

+0

啊我現在看到了。很好解釋。我沒有意識到有兩種不同類型的Set,一種內置於scala.Predef中,另一種內置於scala.collection中。感謝你及時的答覆! – Turtle

相關問題