Java在Java 5中引入了带有泛型的类型擦除,因此它们可以在旧版本的Java上工作.这是兼容性的权衡.我们已经失去了兼容性[1] [2] [3] - 字节码可以在更高版本的JVM上运行,但不能在早期版本上运行.这看起来是更糟糕的选择:我们丢失了类型信息,我们仍然无法在旧版本上运行为较新版本的JVM编译的字节码.发生了什么?
具体来说,我要问,如果有任何技术原因,类型擦除不能在JVM的下一个版本中删除(假设,就像以前的版本中,它的字节码将无法反正在最后版本上运行).
[3]:对于那些真正喜欢它的人来说,类型擦除可能会以类似于retrolambda的方式向后移植.
编辑:我认为关于向后兼容性的定义的讨论模糊了这个问题.
Lambda是在Java8中引入的.包含lambda表达式的代码是否会在较旧的JVM上运行,例如,对于java 1.6?我担心二进制兼容性而不是源代码兼容性.这是一个简单的是/否问题.
谢谢.
伙计们,
我正在尝试使用Ant和终端上的Javac Cross编译.在本地和集成环境中,我在最基本的问题上遇到了同样的问题.
我在linux终端中运行它(以及在windows和cmd上的cygwin上):
javac -target 1.6 -source 1.7 -bootclasspath /usr/java/jdk1.6.0_27/jre/lib/rt.jar Main.java
Run Code Online (Sandbox Code Playgroud)
与Main.java只有System.out.println.
javac -version ==> javac 1.7.0_11
Run Code Online (Sandbox Code Playgroud)
我收到错误消息:
javac: source release 1.7 requires target release 1.7
Run Code Online (Sandbox Code Playgroud)
我在本地Windows机器上具有大致相同的配置,结果完全相同.
我的理解是,交叉编译的全部内容是编译一些与更高版本的jdk兼容的源代码,使用更高版本的jdk,但是传递的目标版本的rt.jar应该更低.
如果目标和来源相同,那就有效了.
target=1.7 and source=1.7 workd fine
target=1.6 and source=1.6 worked just fine
Run Code Online (Sandbox Code Playgroud)
但我想要交叉编译,那么我做错了什么呢?
我很感激能得到的所有帮助,并提前感谢.