В scala есть ли способ проверить, является ли экземпляр одиночным объектом или нет?

Если у меня есть экземпляр объекта, есть ли способ проверить, есть ли у меня объект singleton, а не экземпляр класса? Можно ли это сделать? Может быть, какой-то отраженный API? Я знаю, что одно отличие состоит в том, что имя класса одноэлементного объекта заканчивается на $, но это не является строгим способом.

Ответ 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 как доказательство во время компиляции, когда тип является одноэлементным типом.