我有一个包含100个不同case类的单例对象,例如:
object Foo { case class Bar1 { ... } ... case class Bar100 { ... } }
我希望能够迭代每一个案例类。就像在一个Seq中获得所有的案例类,然后能够Map它。(例如,用多态函数Map)是否可以使用反射?如果可以,如何使用?与硬编码一个包含所有case类的序列相比,使用反射有什么缺点?
w7t8yxp51#
Foo.getClass.getDeclaredClasses提供了在Foo中声明的所有类,因为它们是case类,每个类还定义了一个伴随对象(也是类),所以需要过滤掉它们:Foo.getClass.getDeclaredClasses.filterNot(_.endsWith("$"))反射很慢,但是如果你只打算做一次(没有理由做不止一次,因为你总是会得到相同的结果),这不是一个真正的问题。一个更大的问题是,我真的无法想象一个“多态函数”,它可以让你在不进行极端黑客攻击的情况下对这些信息做任何有用的事情。
Foo.getClass.getDeclaredClasses
Foo
Foo.getClass.getDeclaredClasses.filterNot(_.endsWith("$"))
rt4zxlrg2#
在Scala 3中完全存在parametricpolymorphic functions。在Scala 2中没有参数多态函数(和多态值,只有多态methods),但有ad-hoc多态函数通常使用无形状实现。我猜在Shapeless中有一个类型类(Generic/LabelledGeneric),用于迭代扩展某些密封特征的case类
Generic
LabelledGeneric
case class Bar1() extends MyTrait //... case class Bar100() extends MyTrait
Scala how to derivate a type class on a traitUse the lowest subtype in a typeclass?Type class instance for case objects defined in sealed traitIteration over a sealed trait in Scala?Getting subclasses of a sealed traitCan I get a compile-time list of all of the case objects which derive from a sealed parent in Scala?但不适用于迭代嵌套在对象中的case类,所以我们可能无论如何都需要一个macro(编译时反射),即使使用Shapelessx一个一个一个一个x一个一个二个x
2条答案
按热度按时间w7t8yxp51#
Foo.getClass.getDeclaredClasses
提供了在Foo
中声明的所有类,因为它们是case类,每个类还定义了一个伴随对象(也是类),所以需要过滤掉它们:Foo.getClass.getDeclaredClasses.filterNot(_.endsWith("$"))
反射很慢,但是如果你只打算做一次(没有理由做不止一次,因为你总是会得到相同的结果),这不是一个真正的问题。
一个更大的问题是,我真的无法想象一个“多态函数”,它可以让你在不进行极端黑客攻击的情况下对这些信息做任何有用的事情。
rt4zxlrg2#
在Scala 3中完全存在parametricpolymorphic functions。在Scala 2中没有参数多态函数(和多态值,只有多态methods),但有ad-hoc多态函数通常使用无形状实现。
我猜在Shapeless中有一个类型类(
Generic
/LabelledGeneric
),用于迭代扩展某些密封特征的case类Scala how to derivate a type class on a trait
Use the lowest subtype in a typeclass?
Type class instance for case objects defined in sealed trait
Iteration over a sealed trait in Scala?
Getting subclasses of a sealed trait
Can I get a compile-time list of all of the case objects which derive from a sealed parent in Scala?
但不适用于迭代嵌套在对象中的case类,所以我们可能无论如何都需要一个macro(编译时反射),即使使用Shapeless
x一个一个一个一个x一个一个二个x