如何检查值是否是没有静态类型的Scala单例对象?

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)
点赞