В настоящее время (2011) вы можете использовать рефлексию, чтобы узнать, реализует ли класс интерфейс scala.Product
:
scala> def isCaseClass(o: AnyRef) = o.getClass.getInterfaces.find(_ == classOf[scala.Product]) != None
isCaseClass: (o: AnyRef)Boolean
scala> isCaseClass(Some(1))
res3: Boolean = true
scala> isCaseClass("")
res4: Boolean = false
Это всего лишь приближение - вы можете пойти дальше и проверить, имеет ли онМетод copy
, если он реализует Serializable
, если у него есть сопутствующий объект с соответствующим методом apply
или unapply
- по сути, проверьте все вещи, ожидаемые от класса case, с помощью отражения.
Пакет отражений scala, входящий в один из следующих выпусков, должен упростить и точнее определить класс дел.
РЕДАКТИРОВАТЬ:
Теперь вы можете сделать это с помощью новой библиотеки Scala Reflection -см. другой ответ.