获取密封特质的子类

21

是否有可能(通过宏、某种形式的Shapeless自动化或其他方式)获取密封特质子类的列表:

  • 在编译时?
  • 在运行时?

1
是的。我们正在使用https://github.com/julienrf/play-json-variants,它可以作为您参考的工具。 - mavarazy
@mavarazy 谢谢你的帮助。这段代码非常依赖于 Play 框架,很难看出来(至少我是这样认为的)如何因素最低的要求功能:您是否愿意发布一个自包含的变体 baseAndVariants' 等功能作为答案? - NietzscheanAI
1个回答

33
您无需使用任何第三方库来完成此操作:
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)

输出:

SubClass1 对象

SubClass2 对象


谢谢 - 这在对象范围内有效,但似乎无法在函数内部工作:在Scala 2.11.7下,我得到: *没有可用于此.MyTrait的TypeTag *方法typeOf的参数不足:(implicit ttag:reflect.runtime.universe.TypeTag [this.MyTrait])reflect.runtime.universe.Type。未指定值参数ttag。 - NietzscheanAI
1
“在函数内部”是什么意思?您能否编辑问题并附上您的代码? - Max
1
现在已排序:在我的特定用例中(在通用函数内调用上述功能),只需要一个TypeTag,以便可以在通用类型上调用ru.typeOf。 - NietzscheanAI

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接