私は簡単なアプリケーションを持っています:
object Test extends App {
implicit def t2mapper[X, X0 <: X, X1 <: X](t: (X0, X1)) = new {
def map[R](f: X => R) = (f(t._1), f(t._2))
}
println("Hello!")
val (foo, bar) = (1, 2) map (_ * 2)
println((foo, bar))
}
(これt2mapper
はこの回答からのものです。)
コードは正常にコンパイルされます。
$ scalac -version
Scala compiler version 2.9.1 -- Copyright 2002-2011, LAMP/EPFL
$ scalac -unchecked Test.scala
$
しかし、実行すると、IllegalAccessError
(印刷される前に)をスローします: Hello!
$ java -version Javaバージョン「1.6.0_24」 OpenJDKランタイム環境(IcedTea6 1.11.1)(6b24-1.11.1-4ubuntu3) OpenJDKサーバーVM(ビルド20.0-b12、混合モード) $scalaテスト java.lang.IllegalAccessError:クラスTest $ delayedInit$bodyからフィールドTest$.reflParams$Cache1にアクセスしようとしました Test $ delayedInit $ bodyで。(Test.scala:6) Test $で。(Test.scala:1) Test $で。(Test.scala) Test.main(Test.scala)で sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)で sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)で sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)で java.lang.reflect.Method.invoke(Method.java:616)で scala.tools.nsc.util.ScalaClassLoader $$ anonfun $ run $ 1.apply(ScalaClassLoader.scala:78)で scala.tools.nsc.util.ScalaClassLoader $ class.asContext(ScalaClassLoader.scala:24)で scala.tools.nsc.util.ScalaClassLoader $ URLClassLoader.asContext(ScalaClassLoader.scala:88)で scala.tools.nsc.util.ScalaClassLoader $ class.run(ScalaClassLoader.scala:78)で scala.tools.nsc.util.ScalaClassLoader $ URLClassLoader.run(ScalaClassLoader.scala:101)で scala.tools.nsc.ObjectRunner $ .run(ObjectRunner.scala:33)で scala.tools.nsc.ObjectRunner $ .runAndCatch(ObjectRunner.scala:40)で scala.tools.nsc.MainGenericRunner.runTarget $ 1(MainGenericRunner.scala:56)で scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:80)で scala.tools.nsc.MainGenericRunner $ .main(MainGenericRunner.scala:89)で scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)で
最後の2行がに置き換えられていることに注意してください
println((1, 2) map (_ * 2))
また
val (foo, bar) = (2, 4)
println((foo, bar))
また
val intermediate = (1, 2) map (_ * 2)
val (foo, bar) = intermediate
println((foo, bar))
期待どおりに印刷(2,4)
されます。しかし、ブロックに包まれたとき
{
val intermediate = (1, 2) map (_ * 2)
val (foo, bar) = intermediate
println((foo, bar))
}
また
private val blah = {
val intermediate = (1, 2) map (_ * 2)
val (foo, bar) = intermediate
println((foo, bar))
}
例外をスローします。
最初と最後の方法でJVMが実行時にエラーをスローするのはなぜですか?