我正在使用Scala 2.10.0-M7中的反射,并偶然发现了ClassSymbol.isCaseClass
方法,该方法在scala控制台中的行为与预期相似,但在作为Java应用程序或scala脚本执行时则不行。
我已经像这样定义了TestScript.scala
:
import reflect.runtime.currentMirror
case class TestCase(foo: String)
object Test {
def main(args: Array[String]) {
val classSymbol = currentMirror.reflect(new TestCase("foo")).symbol
val isCaseClass = classSymbol.isCaseClass
println(s"isCaseClass: $isCaseClass")
}
}
Test.main(Array())
如果我在命令行上调用
执行它$ scala TestScript.scala
我得到了这个输出:
isCaseClass: false
如果我将代码输入到交互式scala shell中,或者像这样加载它:
scala> :load TestScript.scala
我得到以下正确的输出:
Loading TestScript.scala...
import reflect.runtime.currentMirror
defined class TestCase
defined module Test
isCaseClass: true
如果我编译它并将其作为标准Java应用程序执行,我会再次false
获得ClassSymbol.isCase
。
我错过了什么? scala控制台环境和Java运行时环境之间有什么区别?如何在实际应用中获得正确的结果?
答案 0 :(得分:2)
https://issues.scala-lang.org/browse/SI-6277
val classSymbol = cm.reflect(new TestCase("foo")).symbol
{ classSymbol.typeSignature }
val isCaseClass = classSymbol.isCaseClass
println(s"isCaseClass: $isCaseClass")
编辑:要回答您的上一个问题,您不会在实际应用程序中使用里程碑。 :)
UPD。自Scala 2.10.0-RC1起修复。