Scala 获取密封特征的子类
是否有可能(通过宏、某种形状的automagic或其他方式)获得密封特征的子类列表:Scala 获取密封特征的子类,scala,scala-macros,shapeless,scala-reflect,Scala,Scala Macros,Shapeless,Scala Reflect,是否有可能(通过宏、某种形状的automagic或其他方式)获得密封特征的子类列表: 在编译时 在运行时 您不需要任何第三方库来执行此操作: sealed trait MyTrait case object SubClass1 extends MyTrait case object SubClass2 extends MyTrait import scala.reflect.runtime.{universe => ru} val tpe = ru.typeOf[MyTrait]
- 在编译时
- 在运行时
sealed trait MyTrait
case object SubClass1 extends MyTrait
case object SubClass2 extends MyTrait
import scala.reflect.runtime.{universe => ru}
val tpe = ru.typeOf[MyTrait]
val clazz = tpe.typeSymbol.asClass
// if you want to ensure the type is a sealed trait,
// then you can use clazz.isSealed and clazz.isTrait
clazz.knownDirectSubclasses.foreach(println)
输出:
对象子类1
对象子类2
对我们正在使用,你可以将它用作reference@mavarazy谢谢你。代码完全依赖于Play框架,如何计算出所需的最低功能(对我来说)并不明显:您是否愿意发布一个“baseAndVariants”etc功能的自包含变体作为答案?谢谢-这在对象范围内有效,但在函数内部似乎不起作用:在Scala 2.11.7下,我得到:*没有可用于此.MyTrait的TypeTag*没有足够的参数用于方法typeOf:(隐式ttag:reflect.runtime.universe.TypeTag[this.MyTrait])reflect.runtime.universe.Type。未指定的值参数ttag。函数中的
是什么意思?你能用你的代码编辑这个问题吗?现在分类:在我的特定用例中(在泛型函数中调用上述功能),只需要一个TypeTag,这样就可以在泛型类型上调用ru.typeOf。