I was wondering if there as a way to know if an object is an instance of a case class. I was trying to find some structural type matching unapply
, I notice they inherit Product
. My real need for a function that would go something like:
def withCaseClass[T <: /* matcher for case class */](obj:T) ...
My major interest is to make sure only case classes can be passed to this function.
A case class
is an implementation detail. One can create a class that acts exactly like a case class -- and the ability to do so is a very important thing, as it ensures one can switch to a normal class if some particular requirement makes that a better choice.
There's no marker trait for either case classes or tuples, so I'm afraid your best bet might be to check that it extends Product and isn't in any package starting with "scala.*". :/
As you can do exactly the same "manually" what the compiler does for case classes, and because the produced byte-code would be indistinguishable (is this even a word? looks funny...), you are out of luck. The real question is: Why should you care about?
In Java I've used
Product.class.isAssignableFrom(someClassThatMayBeACaseClass);
to detect if something is a case class. Though it's likely there are Products that are not case classes.
来源:https://stackoverflow.com/questions/4697534/knowing-if-a-scala-object-is-an-instance-of-case-class