Ответ 1
Да, используя мало документированный тип scala.Singleton
:
def isSingleton[A](a: A)(implicit ev: A <:< Singleton = null) =
Option(ev).isDefined
И затем:
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
Мой метод isSingleton
представляет собой просто демонстрацию, которая обеспечивает булевское значение времени выполнения, которое сообщает вам, является ли выражение статически типизированным как одноэлементный тип, но вы также можете использовать Singleton
как доказательство во время компиляции, когда тип является одноэлементным типом.