来源和行为兼容性

Source and Behavioral compatibility

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

如果 Java 8 和 Java 7 之间存在源代码不兼容,这是否意味着尽管 运行 Java 7 编译的代码在Java 8 可以正常工作,但是如果我用 Java 8 重新编译该代码,我会得到一个错误吗?

是的,尽管这些情况确实很少见,而且有充分的理由。

我能想到的一个明显的例子是有计划地发生这种情况的地方是在引入 enumassert 关键字时。

以下将使用 Java 1.4 编译:

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

并且在任何更高版本的 JVM 上仍会 运行,但它不会使用更高版本的 Java 再次编译。或者更准确地说,如果不为 javac.

指定 -source 1.4 选项,它就不会编译

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