正如sepp2k
他在评论中已经提到的,该符号Map
指的是 的伴随对象Map
,它使您可以访问其单个实例。在模式匹配中,这通常用于识别消息:
scala> case object Foo
defined module Foo
scala> def send[A](a: A) = a match { case Foo => "got a Foo" case Map => "got a Map" }
send: [A](a: A)String
scala> send(Map)
res8: String = got a Map
scala> send(Foo)
res9: String = got a Foo
如果您编写Map()
,您将调用apply
object 的方法Map
。因为你没有给任何值插入到Map
编译器不能推断任何类型,因此它必须使用底部类型-Nothing
这是每个类型的子类型。尽管存在差异,但它是唯一一种不会破坏类型系统的推断类型。不Nothing
存在以下代码将无法编译:
scala> Map(1 -> 1) ++ Map()
res10: scala.collection.mutable.Map[Int,Int] = Map(1 -> 1)
如果您查看其类型签名++
如下(来源)
def ++[B1 >: B](xs: GenTraversableOnce[(A, B1)]): Map[A, B1]
您会注意到下限类型参数B1 >: B
。因为Nothing
是所有事物的子类型(B
在我们的例子中),编译器可以找到一个B1
(Int
在我们的例子中)并成功地推断出我们的 Map 的类型签名。这个下界是必需的,因为B
它是协变的(source),
trait MapLike[A, +B, ...] ...
这意味着我们不允许将其作为方法参数传递(因为方法参数处于逆变位置)。如果方法参数不在逆变位置,则类型系统将不再保留Liskov 的替换原则。因此,必须找到编译新类型(这里称为B1
)的代码。
正如Didier Dupont
已经指出的那样,Scaladoc 2.9 中存在一些错误,这些错误在 2.10 中得到解决。不仅会显示一些遗漏的方法,还可以显示隐式转换添加的方法(例如Array确实显示了 2.10 中的很多方法,而 2.9 中没有显示)。