我的另一个问题是重复的,所以我会再试一次.我也读过这个问题,我问的是不同的.我有兴趣学习内部实现的Call-by-Name: => Type不同之处() => Type.
我的困惑来自于查看javap和cfr反汇编,这两个案例没有区别.
例如ParamTest.scala:
object ParamTest {
def bar(x: Int, y: => Int) : Int = if (x > 0) y else 10
def baz(x: Int, f: () => Int) : Int = if (x > 0) f() else 20
}
Run Code Online (Sandbox Code Playgroud)
javap输出 javap ParamTest.scala:
public final class ParamTest {
public static int baz(int, scala.Function0<java.lang.Object>);
public static int bar(int, scala.Function0<java.lang.Object>);
}
Run Code Online (Sandbox Code Playgroud)
CFR反编译输出 java -jar cfr_0_118.jar …
我正在试图找出用于编译的Scala版本A.jar.我有两个版本:一个来自我的ivy2 repo,另一个来自Maven.
运行后jar -xf A.jar,我grepped为scala和version,但一无所获:
$grep -ri scala *
$grep -ri version *
Run Code Online (Sandbox Code Playgroud)
因此,基于解压缩*JAR,如何确定使用哪个版本的Scala进行编译?
*解压缩=运行 java xf <name of jar>
我有遗留代码库的问题.我想开始用1.6类格式编译它,但有一个问题只有在我尝试运行编译代码时才会显示出来.我得到以下异常:
java.lang.ClassFormatError:类FooBar 0x209中的非法类修饰符
谷歌搜索这并没有透露很多细节.据此,该问题可能与接口和实现修饰符之间的不匹配有关.当然,它必须是一些新的限制,而不是1.5.
问题是类很大,并且有很多内部类和内部内部类,所以问题很难追查(这是我确定的内部类之一).毋庸置疑,该课程没有任何测试,因此改变它需要极其谨慎并且很费力.
那么,有没有人有关于0x209的任何确切信息 - 代码具体是什么意思?
编辑:
感谢Arne让我们朝着正确的方向前进,我们能够追踪问题并制定解决方法.根本原因尚不清楚,但现在我们可以避免它.
我们在某些领域使用Doug Lea的古老util.concurrent包,因为有些组件在只提供Java 1.1的环境中运行(是的,笑,我不介意).
这个相同的代码(使用并发工具)也被用作另一个相关软件的一个小组件.由于Doug的代码使用了1.2的一些特性,我们还被迫修改util.concurrent的某些部分,使其与Sun的1.1反向移植集合包兼容(无法找到那些链接).不知何故,它导致了这种特殊的Eclipse编译行为,当我们将类格式更改为Java 1.6时会发生这种行为.这是导致问题的最小代码:
EDU.oswego.cs.dl.util.concurrent.ConcurrentHashMap;
import com.sun.java.util.collections.Map;
public class FooBar
{
public static void main(String[] args) {
Map.Entry e = (Map.Entry)(new ConcurrentHashMap().entrySet().iterator().next());
}
}
Run Code Online (Sandbox Code Playgroud)
用Eclipse编译它(编译设置为1.6,1.5工作正常)并尝试从Sun的1.6 JRE加载类时出现问题.解决方法:我们循环访问键并使用键获取循环内部的值,而不是循环访问条目.
我们在这里的设置非常具有异国情调,难怪其他人都没有碰到这个.我终于检查了我们的构建脚本,并且看,ant-script有1.6个源和目标设置.显然这是特定于Eclipse的.
EDIT2:
我看得更接近我在这里链接的Sun bug报告.那里的问题也与com.sun.java.util.collections.Map.Entry有关.这与Sun的Javac有关.有趣.