Знание, является ли объект Scala экземпляром класса Case - PullRequest
4 голосов
/ 15 января 2011

Мне было интересно, есть ли способ узнать, является ли объект экземпляром класса case.Я пытался найти структурный тип, соответствующий unapply, я заметил, что они наследуют Product.Моя реальная потребность в функции, которая будет выглядеть примерно так:

def withCaseClass[T <: /* matcher for case class */](obj:T) ...

Мой главный интерес - убедиться, что в эту функцию можно передавать только классы case.

Ответы [ 4 ]

7 голосов
/ 15 января 2011

A case class - это деталь реализации.Можно создать класс, который будет действовать точно так же, как класс case - и возможность сделать это очень важная вещь, поскольку он гарантирует, что один может переключиться на нормальный класс, если какое-то конкретное требование делает это лучшевыбор.

2 голосов
/ 15 января 2011

Поскольку вы можете делать то же самое «вручную», что компилятор делает для классов case, и поскольку полученный байт-код будет неразличим (это даже слово? Выглядит смешно ...), вам не повезло , Реальный вопрос: почему вы должны заботиться?

2 голосов
/ 15 января 2011

Для маркеров классов и кортежей нет признака маркера, поэтому я боюсь, что вам лучше всего убедиться, что он расширяет продукт и не входит ни в один пакет, начинающийся с "scala. *".: /

0 голосов
/ 29 октября 2012

В Java я использовал

Product.class.isAssignableFrom(someClassThatMayBeACaseClass);

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

...