Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 获取密封特征的子类_Scala_Scala Macros_Shapeless_Scala Reflect - Fatal编程技术网

Scala 获取密封特征的子类

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]

是否有可能(通过宏、某种形状的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]
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。