Знание, является ли объект Scala экземпляром класса Case
Мне было интересно, есть ли способ узнать, является ли объект экземпляром класса case. Я пытался найти какое-то структурное соответствие типов unapply
Я заметил, что они наследуют Product
, Моя реальная потребность в функции, которая бы работала примерно так:
def withCaseClass[T <: /* matcher for case class */](obj:T) ...
Мой основной интерес заключается в том, чтобы в эту функцию можно было передавать только классы case.
4 ответа
case class
это деталь реализации. Можно создать класс, который будет действовать точно так же, как и класс case - и способность делать это очень важная вещь, так как она гарантирует, что можно переключиться на нормальный класс, если какое-то конкретное требование сделает этот выбор лучшим.
Для маркеров классов и кортежей нет признаков маркера, поэтому я боюсь, что вам лучше всего убедиться, что он расширяет продукт и не входит ни в один пакет, начинающийся с "scala.*".:/
Поскольку вы можете делать то же самое "вручную", что и компилятор для классов case, и поскольку полученный байт-код будет неразличим (это даже слово? Выглядит смешно...), вам не повезло. Реальный вопрос: почему вы должны заботиться?
В Java я использовал
Product.class.isAssignableFrom(someClassThatMayBeACaseClass);
обнаружить, если что-то является классом случая. Хотя, скорее всего, есть продукты, которые не относятся к классам случаев.