在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]?感谢。
答案 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"})