賢明であろうとなかろうと、私は Scala シングルトン、つまりクラスやトレイトの構築されたインスタンスではなく「オブジェクト」を介して実装されたオブジェクトのみを受け入れたいメソッドを書いています。どのタイプの Scala シングルトンも受け入れる必要があるため、"MySingleton.type" は使用できません。
APIドキュメントには記載されていない非常に奇妙な構造「scala.Singleton」に出くわしましたが、うまくいくようです:
scala> def check( obj : Singleton ) = obj
check: (obj: Singleton)Singleton
scala> check( Predef )
res0: Singleton = scala.Predef$@4d3e9963
scala> check ( new java.lang.Object() )
<console>:9: error: type mismatch;
found : java.lang.Object
required: Singleton
check ( new java.lang.Object() )
scala> check( Map )
res3: Singleton = scala.collection.immutable.Map$@6808aa2d
scala> check( Map.empty[Any,Any] )
<console>:9: error: type mismatch;
found : scala.collection.immutable.Map[Any,Any]
required: Singleton
check( Map.empty[Any,Any] )
ただし、かなり不可解なことに (私には)、明示的に構築された文字列はそうではありませんが、文字列リテラルはシングルトンとして受け入れられます。
scala> check( "foo" )
res7: Singleton = foo
scala> check( new String("foo") )
<console>:9: error: type mismatch;
found : java.lang.String
required: Singleton
check( new String("foo") )
文字列リテラルがシングルトンに準拠するのはなぜですか? シングルトン型が指定することになっているものを誤解していますか?