在 Scala 中,我对这个相当同义反复的错误消息感到非常困惑:
java.lang.ClassCastException: FOO cannot be cast to FOO
我希望某人总是可以被塑造成自己的类型。
我正在尝试在 scala 编译器周围运行以下包装器,位于 http://code.google.com/p/rooscaloo/source/browse/trunk/rooscaloo/src/org/darevay/rooscaloo/Interpreter.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] 的工作示例代码?谢谢。
我遇到了类似的问题,并且我已将代码转换为使用 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"})