【发布时间】:2015-12-03 17:20:16
【问题描述】:
鉴于this question 和SI-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