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
と書くと object のメソッドをMap()
呼び出します。コンパイラに挿入する値を指定しなかったため、コンパイラは型を推測できません。したがって、すべての型のサブタイプである一番下の型を使用する必要があります。差異はありますが、型システムを壊すことのない推論可能な唯一の型です。次のコードはコンパイルされません。apply
Map
Map
Nothing
Nothing
scala> Map(1 -> 1) ++ Map()
res10: scala.collection.mutable.Map[Int,Int] = Map(1 -> 1)
次のような型シグネチャを見ると++
( source )
def ++[B1 >: B](xs: GenTraversableOnce[(A, B1)]): Map[A, B1]
下限の型パラメーターに気付くでしょうB1 >: B
。Nothing
はすべてのサブタイプであるため(この場合は)、コンパイラは(この場合は)B
を見つけて、Map の型シグネチャを正常に推論できます。は共変 ( source ) であるため、この下限が必要です。B1
Int
B
trait MapLike[A, +B, ...] ...
つまり、メソッド パラメーターとして渡すことはできません (メソッド パラメーターは反変の位置にあるため)。メソッドのパラメーターが反変の位置にない場合、Liskov の置換原則は型システムによって保持されなくなります。したがって、新しい型 (ここでは と呼ばれる) をコンパイルするコードを取得するには、B1
見つけなければなりません。
Didier Dupont
すでに指摘したように、Scaladoc 2.9 にはいくつかのバグがあり、2.10 で解決されています。そこにはいくつかの欠落したメソッドが表示されるだけでなく、暗黙的な変換によって追加されたメソッドも表示できます (たとえば、 Arrayは、2.9 では表示されない 2.10 の多くのメソッドを表示します)。