【问题标题】:scala: FOO cannot be cast to FOOscala: FOO 不能转换为 FOO
【发布时间】: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


【解决方案1】:

我遇到了类似的问题,我已将代码转换为使用 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"})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 2011-01-18
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多