Knowing if a Scala object is an instance of Case Class

不羁岁月 提交于 2019-12-07 10:18:43

问题


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!