在scala中,有没有办法检查实例是否是单例对象?

Sle*_*ePy 10 scala

如果我有一个对象的实例,有没有办法检查我是否有一个单例对象而不是一个类的实例?有没有办法可以做到这一点?可能是一些反思API?我知道一个区别是单例对象的类名以a结尾$,但这不是一种严格的方法.

Tra*_*own 22

是的,使用记录很少的scala.Singleton类型:

def isSingleton[A](a: A)(implicit ev: A <:< Singleton = null) = 
  Option(ev).isDefined
Run Code Online (Sandbox Code Playgroud)

然后:

scala> val X = new Foo(10)
X: Foo = Foo@3d5c818f

scala> object Y extends Foo(11)
defined object Y

scala> isSingleton(X)
res0: Boolean = false

scala> isSingleton(Y)
res1: Boolean = true
Run Code Online (Sandbox Code Playgroud)

我的isSingleton方法只是一个演示,它提供了一个运行时布尔值,告诉您表达式是否静态类型为单例类型,但您也可以Singleton在编译时使用类型为单例类型的证据.