19

是否有可能(通过宏、某种形式的 Shapeless automagic 或其他方式)获得密封特征的子类列表:

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

1 回答 1

32

您不需要任何 3rd 方库来执行此操作:

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

于 2015-12-31T18:51:03.327 回答