【发布时间】:2011-09-16 01:55:12
【问题描述】:
在 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 新手,但 scala.tools.nsc.interpreter 包的内部机制 binder 可能正在尝试做一些奇怪的事情。
我以scala Test.scala 的身份调用脚本。
问题
我的问题是:此错误消息的原因是什么,真正的问题是什么,以及如何获得 scala.tools.nsc.[interpreter] 的工作示例代码?谢谢。
【问题讨论】:
-
当有人最终用不同的类加载器加载同一个类时,我通常会看到这种消息。不完全是一个解决方案,但您可能需要进一步调查。
-
@Sanjay:谢谢。不幸的是,我对 Java 的内部工作原理并不熟悉。那是什么意思?我知道 .class 文件是文件的编译版本,包含 JVM 字节码,并且 ClassLoader 是根据某些策略加载类的东西(我猜有某种基于默认文件系统类路径的 ClassLoader?) .但是,我对您的评论感到困惑,因为我不明白 ClassLoader “生活”在哪里,以及通常会导致多个 ClassLoader 在同一个程序中隐式使用的原因。谢谢。
-
Scala“解释器”首先编译代码,然后将类加载到JVM中。
-
另外,这段代码似乎很老了。我在 Scala 2.7.7、2.8.1 和主干上进行了尝试,得到了各种错误,所有这些都与
org.darevay不在类路径中有关。我根本没有得到你的错误,所以如果你能提供更多关于如何重现的细节(Scala 版本,你采取了哪些步骤),那将会很有帮助。
标签: java scala reflection compiler-construction casting