如果我有一个对象的实例,有没有办法检查我是否有一个单例对象而不是一个类的实例?
有没有办法可以做到这一点?可能是一些反思API?
我知道一个区别是单个对象的类名以$
结尾,但这不是一个严格的方法。
答案 0 :(得分:22)
是的,使用记录很少的scala.Singleton
类型:
def isSingleton[A](a: A)(implicit ev: A <:< Singleton = null) =
Option(ev).isDefined
然后:
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
我的isSingleton
方法只是一个演示,提供一个运行时布尔值,告诉您表达式是否静态类型为单例类型,但您也可以在编译时使用Singleton
作为证据类型为单例类型的时间。
答案 1 :(得分:0)
以下是我找到解决此问题的最佳方案:
import scala.reflect.runtime.currentMirror
def isSingleton(value: Any) = currentMirror.reflect(value).symbol.isModuleClass
基于How to determine if `this` is an instance of a class or an object?