奇怪的scala.collection.immutable.Set添加行为

时间:2014-02-11 09:11:46

标签: scala scala-collections

为什么此代码不起作用:

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)

因此?

1 个答案:

答案 0 :(得分: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为Double。类型推断现在尝试查找可以将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