明智或不明智,我正在编写一个方法,我希望仅接受Scala单例,即通过“object”实现的对象,而不是类或特质的构造实例。它应该接受任何类型的Scala单例,因此"MySingleton.type"不行。
我遇到了非常奇怪的构造“scala.Singleton”,它没有在API文档中记录,但似乎能解决问题:
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") )
为什么字符串字面量符合Singleton?我是否误解了Singleton类型应该指定的内容?
scala.Singleton
,而且文档中也没有提到。我不会打赌它会做出任何特定的承诺。事实上,我不确定有什么硬性标准可以将单例对象与类区分开来。您能详细说明一下您尝试通过识别它们来实现什么吗? - 0__check(1)
也是可以的。好像所有的原始值都被视为单例。check(Double.NegativeInfinity)
也可以工作。 - nairbv