我写了一些斯卡拉:
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();
就像 Luigi 写的那样,这导致了一个奇怪的NoSuchMethodException
.
我进入了下一个级别,并使用javap -verbose
了 ,它给出了这个:
29: invokeinterface #40, 1; //InterfaceMethod scala/collection/Parallelizable.par:()Lscala/collection/Parallel;
这让我想知道如果我在 Java 中Parallelizable
调用之前转换为 a 会发生什么: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 的知识。
有谁知道为什么演员阵容会有所不同?