2014-02-11 64 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