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

时间:2016-05-23 10:33:18

标签: scala

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("$")更好?

1 个答案:

答案 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)