【问题标题】:Scala reflection: knownDirectSubclasses only works for sealed traits?Scala 反射:knownDirectSubclasses 仅适用于密封特征?
【发布时间】:2015-12-03 17:20:16
【问题描述】:

鉴于this questionSI-7046,这完全不是我所期望的。

scalac test.scala && scala Test in Scala 2.11.6 在下面打印一个空的Set()

trait Foo
case class Bar() extends Foo
case class Baz() extends Foo

object Test {
  def main(args: Array[String]) {
    import scala.reflect.runtime.universe._
    println( typeOf[Foo].typeSymbol.asClass.knownDirectSubclasses )
  }
}

但是,如果我将trait Foo 更改为sealed trait Foo,它会按预期打印Set(class Bar, class Baz)

这是怎么回事?

【问题讨论】:

  • 您是否尝试过实际使用/引用 Bar 和 Baz? JVM 使用类加载器(duh)动态加载类。对于看似不相关的类,它可能有不同的加载规则,这些类只是扩展了一些东西,但对密封的特征更加详尽。
  • 好问题!我检查并为 Baz() 和 Bar() 添加声明 + println 没有任何区别。

标签: scala reflection scala-reflect


【解决方案1】:

看文档

/** If this is a sealed class, its known direct subclasses.
 *  Otherwise, the empty set.
 *
 *  @group Class
 */
def knownDirectSubclasses: Set[Symbol]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 2018-12-18
    • 2015-09-17
    • 2017-09-08
    • 2019-04-04
    • 1970-01-01
    • 2012-06-24
    相关资源
    最近更新 更多