Знание, является ли объект 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);

обнаружить, если что-то является классом случая. Хотя, скорее всего, есть продукты, которые не относятся к классам случаев.

Другие вопросы по тегам