2011-01-15 5 views
3

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

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

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

+3

, который пытается передать ему нестандартные классы? террористы? –

+0

Я хотел ограничить во время компиляции, что в этот метод передается только объект, который имеет, чем может быть использован в коммутаторе. – Thomas

+0

Как вы хотите использовать их в сопоставлении с шаблонами (у Scala нет конструкции коммутатора, хотя переключатель можно выразить с помощью сопоставления с образцом - сопоставление шаблонов более общее)? –

ответ

2

Нет маркерной черты для классов классов или кортежей, поэтому я боюсь, что лучшим вариантом может быть проверка того, что он расширяет Продукт и не находится в каком-либо пакете, начиная с «scala. *». :/

7

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

2

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

+0

да это слово –

0

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

Product.class.isAssignableFrom(someClassThatMayBeACaseClass); 

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

Смежные вопросы