In scala, is there any way to check if an instance is a singleton object or not?的答案解释了如何检查实例是否静态地知道是一个对象.换句话说,它不适用于这种情况:
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(“$”)更好?
最佳答案 如果你的意思是“单身”,如“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)