2016-05-23 61 views
4

In scala, is there any way to check if an instance is a singleton object or not?的回答解释了如何检查一个实例是否为静态已知的object。换句话说,它不会对这种情况下的工作:如何检查一个值是不是静态类型的Scala单例对象?

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

使用'Any'是一个坏主意 – cchantep

+1

当然,但它是你最终用,一旦你开始使用反射,这就是我需要的背景下,无论如何擦除类型的信息,我已经增加了一个更好的例子。 –

+1

我不知道该怎么做,但我想知道这是什么用例?为什么你的情况下,如果一个实例是第一个单身人士?毕竟,它可能是一个单身人士,而不是'object' ...对象Foo {val bar = new Trait {}}'。 'bar'也是一个单身人士... – Dima

回答

2

如果你的意思是“单身”,如“斯卡拉伴侣”,那么你可以使用这样的事情:

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) 
相关问题