2014-02-11 66 views
0

爲什麼這個代碼不工作:奇怪scala.collection.immutable.Set添加行爲

val xs = Set(1, 4, 8) 
xs + 1.5 

<console>:10: error: type mismatch; 
found : Double(1.5) 
required: Int 
      xs + 1.5 

但是,這是確定:

val xs = Set(1, 4, 8) 
xs.toSet + 1.5 

res1: scala.collection.immutable.Set[AnyVal] = Set(1, 4, 8, 1.5) 

所以呢?

回答

8

這是toSet是如何宣稱:

def toSet[B >: A]: Set[B] 
Converts this immutable set to a set. 

總之它返回一個新Set[B]其中B可以A或任何超類型的A

在做xs.toSet + 1.5您尚未明確聲明類型B。因此,現在類型推斷在確定類型中起作用。它看到xs是一組Int1.5是一個雙。 Type Inference現在試圖找到一個可以將Double作爲參數的類型。

唯一的下一個常見類型的Int和Double是AnyVal。因此B = AnyVal,你會得到一個新的結果集爲Set[AnyVal]。如果您明確指定類型,那麼它顯然即

scala> xs.toSet[Int] + 2.4 
<console>:9: error: type mismatch; 
found : Double(2.4) 
required: Int 
       xs.toSet[Int] + 2.4 

失敗更多參考:reference§6.26.4。類似的question