Warum entsprechen String-Literale Scala Singleton?

Mit Bedacht oder ohne Bedacht schreibe ich eine Methode, die nur Scala-Singletons akzeptiert, d. H. Objekte, die über "object" implementiert wurden, anstatt Instanzen einer Klasse oder eines Merkmals zu konstruieren. Es sollte Scala-Singletons jeglichen Typs akzeptieren, "MySingleton.type" also nicht.

Ich bin auf das sehr seltsame Konstrukt "scala.Singleton" gestoßen, das in den API-Dokumenten nicht dokumentiert ist, aber den Trick zu tun scheint:

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] )

Ziemlich unerklärlicherweise (für mich) werden String-Literale als Singletons akzeptiert, während explizit konstruierte Strings nicht:

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") )

Warum entsprechen String-Literale Singleton? Verstehe ich falsch, was der Singleton-Typ spezifizieren soll?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage