私はいくつかのScalaを書きました:
val data = List(1,2,3)
val par = data.par
val result = par.reduce(_+_)
println(result)
Java Decompilerを使用すると、明らかに次のようになります。
List localList = List..MODULE$.apply(Predef..MODULE$.wrapIntArray(new int[] { 1, 2, 3 }));
ParSeq localParSeq = (ParSeq)localList.par();
少し修正して、このJavaを試しました。
List localList = List$.MODULE$.apply(Predef$.MODULE$.wrapRefArray(new Integer[] { 1, 2, 3 }));
ParSeq localParSeq = (ParSeq)localList.par();
そして、ルイージが書いたように、それは奇妙なことにつながりNoSuchMethodException
ます。
私は次のレベルに行きjavap -verbose
、これを使用しました:
29: invokeinterface #40, 1; //InterfaceMethod scala/collection/Parallelizable.par:()Lscala/collection/Parallel;
そのため、JavaParallelizable
で呼び出す前ににキャストするとどうなるのだろうかと思いました。par
List localList = List$.MODULE$.apply(Predef$.MODULE$.wrapRefArray(new Integer[] { 1, 2, 3 }));
Parallelizable p = (Parallelizable)localList;
Parallel p2 = p.par();
Integer result = (Integer) ((ParSeq)p2).reduce(adder);
System.out.println(result);
それ6
は正しいです:-)
しかし、私は認めなければなりません、私は何も、なぜ私がキャストしなければならないのか分かりません。これにより、JavaとScalaについて学ぶことがまだたくさんあることに気づきました。
キャストが違いを生む理由を誰かが知っていますか?