In scala, is there any way to check if an instance is a singleton object or not?的答案解释了如何检查实例静态已知是object
。换句话说,它不适用于这种情况:
object Obj
val x: Any = Obj
isSingleton(x)
甚至在这里:
trait Trait // not sealed
case Obj extends Trait
class Class extends Trait
val xs: Seq[Trait] = ...
xs.filter(isSingleton)
不幸的是,我想处理这件事。有没有办法做到这一点?或者至少比x.getClass.getName.endsWith("$")
更好?
答案 0 :(得分:2)
如果您的意思是“单身”,就像“Scala伴侣”一样,那么您可以使用以下内容:
def isSingleton(x: Any): Boolean = {
x.getClass.getFields.map(_.getName) contains "MODULE$"
}
比检查x.getClass.getName.endsWith("$")
好多了,但仍然如此。例如:
case class Foo(x: Int)
object Foo
trait Trait // not sealed
object Obj extends Trait
class Class extends Trait
val xs = Seq(42, Obj, "okey", Foo(43), Foo, new Trait {}, (x: Int) ⇒ x * x)
println(xs map isSingleton)
// prints: List(false, true, false, false, true, false, false)