为什么此代码不起作用:
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)
因此?
答案 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
的类型为Int
,1.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