2016-05-23 40 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) 
相關問題