Scala 如何调用trait的所有子类的成员方法?
我使用带有scala reflect的KnownDirectSubclass()列出了给定特征的所有子类。我不知道如何将其转换为对象的实例Scala 如何调用trait的所有子类的成员方法?,scala,reflection,Scala,Reflection,我使用带有scala reflect的KnownDirectSubclass()列出了给定特征的所有子类。我不知道如何将其转换为对象的实例 import scala.reflect.runtime.{universe => ru} sealed trait Parent extends Product { def toPrint: String = { getClass.getSimpleName() + "!!!" } } object UmbrellaObj {
import scala.reflect.runtime.{universe => ru}
sealed trait Parent extends Product {
def toPrint: String = {
getClass.getSimpleName() + "!!!"
}
}
object UmbrellaObj {
case object Child1 extends Parent {}
case object Child2 extends Parent {}
implicit def toString(f: Parent): String = f.toPrint
}
val tpe = ru.typeOf[Parent]
val clazz = tpe.typeSymbol.asClass
println(UmbrellaObj.Child1.toString)
clazz.knownDirectSubclasses.foreach(x => {
println(x.toString)
})
在上面的示例中,我想调用子对象的成员方法,而不是x.toString()。如果您的子类是
object
s,那么您可以像这样检索实例:
// objects are 'module classes'
val modules = clazz.knownDirectSubclasses
.filter(_.isModuleClass).map(_.asClass.module.asModule)
val mirror = ru.runtimeMirror(getClass.getClassLoader)
val instances: Set[Parent] = modules.map(mirror.reflectModule)
.map(_.instance.asInstanceOf[Parent])
Scala中的反射是最后的手段。通常有更好的方法来实现你需要做的事情。您可能希望给出一些上下文,这是关于什么的。至于手头的问题:您只能通过调用构造函数来创建类的实例。需要什么样的参数完全取决于所讨论的类。此外,这些类中的一些可能是抽象的,然后根本不能(直接)实例。考虑使用像Enumeratum这样的库: