【问题标题】:Source and Behavioral compatibility来源和行为兼容性
【发布时间】:2016-06-24 02:34:20
【问题描述】:

我正在研究源不兼容和行为不兼容之间的区别,但我无法真正理解。有人能解释一下吗

例如,如果 Java 8 和 Java 7 之间存在源不兼容,这是否意味着尽管在 Java 8 中运行具有这种不兼容的 Java 7 编译代码可以正常工作,但如果我使用 Java 8 重新编译该代码,我会出现错误?

【问题讨论】:

  • java 7 字节码可以在 java 8 jre 中运行。 java 8 字节码无法在 java 7 jre 中运行
  • 例如,如果 Java 8 和 Java 7 之间存在源不兼容,这是否意味着尽管在 Java 8 中运行具有这种不兼容性的 Java 7 编译代码可以正常工作,但如果我重新编译该代码Java 8,我会得到一个错误?
  • 如果您的目标是 1.8 字节码,即使您不使用任何 java 8 功能,您也无法在 1.7 jre 中运行该 jar
  • @beresfordt OP 询问相反的方向。
  • 不同种类兼容性的定义,在 JDK 的上下文中:blogs.oracle.com/darcy/entry/kinds_of_compatibility

标签: java jvm java-8 java-7


【解决方案1】:

是的,尽管这些情况非常罕见,而且有充分的理由。

我能想到的一个明显的例子是在引入enumassert 关键字时有计划地

以下内容将使用 Java 1.4 编译:

public void foo() {
   int enum = 42;
}

并且仍然可以在任何更高版本的 JVM 上运行,但它不会再次使用更高版本的 Java 进行编译。或者更简洁地说,如果不将 -source 1.4 选项指定给 javac,它将无法编译。

compiler bug you cited 是一个意外可能发生的示例(即使他们提供的示例代码不是很有用,因为即使您设法编译它,在运行时它也会只抛出一个 NPE)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2012-02-14
    • 2012-10-11
    相关资源
    最近更新 更多