Скала: FOO не может быть брошен в FOO - PullRequest
4 голосов
/ 16 июня 2011

В 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. [интерпретатор]?Спасибо.

1 Ответ

0 голосов
/ 01 августа 2011

Я столкнулся с подобной проблемой, и я преобразовал свой код в IMain#mostRecentVar, представленный в Scala 2.9.Вот из 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"})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...