问题
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.
回答1:
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.
回答2:
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.*". :/
回答3:
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?
回答4:
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