2016-03-15 11 views

risposta

22

Sì, usando il poco documentato scala.Singleton tipo:

def isSingleton[A](a: A)(implicit ev: A <:< Singleton = null) = 
    Option(ev).isDefined 

E poi:

scala> val X = new Foo(10) 
X: Foo = [email protected] 

scala> object Y extends Foo(11) 
defined object Y 

scala> isSingleton(X) 
res0: Boolean = false 

scala> isSingleton(Y) 
res1: Boolean = true 

Il mio metodo isSingleton è solo una dimostrazione che fornisce un valore di runtime booleano che indica se o no un'espressione è tipizzata staticamente come un tipo singleton, ma è possibile utilizzare anche Singleton come prova al momento della compilazione che un tipo è un tipo singleton.

+0

Perché non usare 'ev ne null' invece di' Opzione (ev) .isDefined'? – Clashsoft

+0

@Clashsoft Nessun motivo particolare. Il valore di default 'null' è una specie di hack, e dal momento che non è proprio il punto che volevo mantenere le cose come principi altrimenti possibile. –

+0

Inoltre, sei sicuro che 'scala.Singleton' (ancora) esiste? Non è nella documentazione '2.11', e non si trova nemmeno nel repository GitHub? Forse potresti aggiungere un link – Clashsoft

Problemi correlati