scala:FOO无法投射到FOO

时间:2011-06-16 05:16:05

标签: java scala reflection compiler-construction casting

在Scala中,我对这个相当重复的错误信息感到非常困惑:

java.lang.ClassCastException: FOO cannot be cast to FOO

我希望有人可以随时投射到自己的类型。


上下文

我正在尝试围绕位于http://code.google.com/p/rooscaloo/source/browse/trunk/rooscaloo/src/org/darevay/rooscaloo/Interpreter.scala的scala编译器运行以下包装器。不幸的是,当我执行以下操作时,Scala会说ResultHolder cannot be cast to ResultHolder

import org.darevay.rooscaloo._
println(new Interpreter().eval("2"))

我认为println应该接受Any。应该进行的是Interpreter.eval返回ResultHolder类型,这样ResultHolder.value将等于2

此外,尝试打印.value不适用于错误:

(fragment of Test.scala):3: error: value value is not a member of Any                                                                                                                                                 
println(new Interpreter().eval("2").value)

更多详情

java.lang.reflect.InvocationTargetException                                                                                                                                                                           
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        ...
Caused by: java.lang.ClassCastException: org.darevay.rooscaloo.ResultHolder cannot be cast to org.darevay.rooscaloo.ResultHolder
        at binder0$.set(<script>:1)
        at binder0.set(<script>)
        ... 24 more (unsure how to print them)

虽然我是Scala新手,但binder包的内部机制scala.tools.nsc.interpreter可能正在尝试做一些奇怪的事情。

我正在调用脚本scala Test.scala


问题

我的问题是:这个错误消息的原因是什么,真正的问题是什么,以及如何为scala.tools.nsc获取工作示例代码。[interpreter]?感谢。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,我已将我的代码转换为使用Scala 2.9中引入的IMain#mostRecentVar。这是CompilerMatcher我写的:

  val main = new IMain(s)
  main.compileSources(files.map(toSourceFile(_)): _*)
  code map { c => main.interpret(c) match {
    case IR.Error => error("Error interpreting %s" format (c))
    case _ => 
  }}
  val recent = main.mostRecentVar
  val holder = main.valueOfTerm(recent)
  if (holder != Some(expected))
    println("actual: " + holder.map(_.toString).getOrElse{"None"})