scala:FOO 无法转换为 FOO

问题描述 投票:0回答:1

在 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] 的工作示例代码?谢谢。

java scala reflection casting
1个回答
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"})
© www.soinside.com 2019 - 2024. All rights reserved.