Dlaczego literały String są zgodne ze Scala Singleton

Mądrze lub nie, piszę metodę, którą chciałbym zaakceptować tylko dla singli Scala, tj. Obiektów zaimplementowanych za pomocą „obiektu”, a nie skonstruowanych instancji klasy lub cechy. Powinien akceptować singletony Scala dowolnego typu, więc „MySingleton.type” nie będzie działać.

Natknąłem się na bardzo dziwną konstrukcję „scala.Singleton”, która nie jest udokumentowana w dokumentach api, ale wydaje się, że to wystarczy:

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

Jednakże, raczej niewytłumaczalnie (dla mnie), literały łańcuchowe są akceptowane jako singletony, podczas gdy jawnie skonstruowane łańcuchy nie są:

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

Dlaczego literały String są zgodne z Singleton? Czy nie rozumiem, co ma określać typ Singletona?

questionAnswers(3)

yourAnswerToTheQuestion