我发现在 Eclipse 中(使用 Eclipse 编译器)我可以使用一些 Java 7 语言功能,但仍然可以创建 Java 6 类文件。在下图中,您可以看到成功编译为 Java 6 类文件的两个 Java 7 语言特性。但是,注释掉的其他 Java 7 特性不能编译。
我的假设是 Eclipse 正在确定哪些 Java 7 语言特性与 Java 6 JVM 兼容,哪些不兼容。例如,泛型类型 JComboBox 只是一个编译(而不是运行时)特性,所以我可以想象它会如何兼容。虽然我认为 switch String 功能可能会在字节码中产生差异并依赖于新的 JVM 功能,但我可能是错的......
我的问题:
Eclipse 真的足够聪明,可以知道哪些 Java 7 语言特性能够编译成 Java 6 类文件,哪些不能?
下面的例子显然不兼容 1.6 源,那么为什么将“源兼容性”设置为 1.6 不会导致错误呢?
这个“技巧”似乎让我至少可以使用一些 Java 7 语言功能,并且仍然可以创建 Java 6 类文件。将 javac 与源 1.7 和目标 1.6 一起使用会失败,那么为什么会这样呢?Ecilpse 编译器是否具有 javac 所没有的功能?
为了比较,这里是我切换到 Java 6 编译器时的结果,正如预期的那样。