是否有任何具体的例子落后之间的不兼容问题Java版本?
-
11-09-2019 - |
题
有没有不兼容性之间的Java稿Java源代码/Java类文件的目标Java X版本不会编译/下运行的版本Y(其中Y>X)?
通过"Java释放",我的意思是版本,例如:
- JAVA1.0(月份,1996年)
- JAVA1.1(二月份,1997年)
- J2SE1.2(日,1998年)
- J2SE1.3(可能,2000年)
- J2SE1.4(二月份,2002年)
- J2SE5.0(日,2004年)
- Java SE6(December,2006年)
房子的规则:
- 请参考文献和代码的例子。
- 请尽量以非常具体的/具体在你的答案。
- 一类是被标记为@弃用不计作为一个倒退的不相容性。
其他提示
首先,太阳实际上认为所有的版本你所提到的(其他比1.0当然)来 小 释放的,不是主要的。
我不知道有任何实例的二进制的不相容性,在这段时间。但是,已经有一些示例的源不兼容:
在Java5,"enum"成为一个保留字;这不是之前。因此,有来源文件,用枚举,作为一种标识,将汇编在java1.4不会汇编在java5.0.然而,可编制与源1.4来解决这个问题。
添加的方法一个接口,可以打破的来源的兼容性。如果实现一个接口,然后再尝试编制,执行与JAVA,增加了新的方法来界,源文件将不再编译成功,因为它没有实现所有接口的成员。这经常发生与java。sql。声明和其他jdbc接口。该汇编形式的这些"无效"的实现将仍然有效,除非实际上,你呼叫一个方法,这并不存在;如果你这样做,MissingMethodException会被抛出。
这些是几个例子我记得的我的头顶,有可能是其他人。
该接口 java.sql.Connection
延长从Java1.5Java1.6使汇编的所有类实现这种接口的失败。
每个版本的摆动打破了东西对我们来说,从1.3通过1.6.
JDBC问题已经提到的,但现有的码的工作。
从1.5到1.6有一个改变行为的座打破了Cisco客户。
当然,新的保留的关键字进行了介绍。
大个我认为是真正不可原谅的关于太阳的一部分,是系统。getenv().它的工作在1.0,然后是废弃和改变引发错误的所有平台在相当可疑的理由,Mac没有系统的环境变量。那么Mac有系统的环境变量,所以在1.5这是undeprecated和工作。没有合理的理由这样做。返回的一个空集在一Mac(摇动具有更大的跨平台的问题,如果你要关心这个级别的跨平台的一致性)或甚至在所有的平台。
我从来不同意他们关闭功能,但要改变它扔一个错误只是一个纯粹的重大更改,如果他们要这样做,他们应该有只是去除的方法。
但是,真正地从1.0至1.1他们不关心向后兼容性.例如,他们放弃了"私人保护"作为改性剂。
所以结果是,每个版本的变化,足以要求密切的评估,这就是为什么你仍然看到许多1.4问题,在这里,在如此。
主要的那个我能想到的是引进新的保留的话:
Java 1.3: strictfp
Java 1.4: assert
Java 5.0: enum
任何代码之前使用这些数值作为标识符,也不会编制下一个更新版本。
另一个问题,我记得引起问题的一个项目,我的工作就是 一个变化中的默认可见性的JInternalFrames之间的1.2和1.3.他们被默认情况下可见的,但当我们升级到1.3他们似乎都已消失。
之间的1.3和1.4的解释长。parseLong(String)处理空串不同。1.3返回 0
值,而1.4引发 NumberFormatException
.
重新编译是不是需要的,但工作码停止工作,如果它依靠的1.3行为。
语义 存储器模型 改变从1.4至1.5.这是改变,以允许除其他事双检查锁定了。(我认为挥发性的语义是固定的。) 它是残破的。
以下将汇编在Java1.4但是 不 Java1.5或以后。
(Java5引'enum'作为一个关键词。注:它将汇编在Java5如果"源1.4"的选项是提供。)
public class Example {
public static void main(String[] args) {
String enum = "hello";
}
}
又一个例子。sql破兼容性:
在1.5一compareTo(日期)的方法是添加到java。sql。时间戳。这种方法会投掷一ClassCastException如果所提供的日期不是一个实例。sql。时间戳。当然,java。sql。时间戳延伸日期和日期已经有了一个compareTo(日期)的方法,曾与所有日期,所以这意味着,代码相比,时间戳到一个(非Timestamp)日期,会破坏在运行时在1.5.
它们感兴趣地注意到,它的出现,1.6似乎已经固定,这一问题。虽然该文件java。sql。时间戳。compareTo(日期)还说:"如果争论不是 Timestamp
对象,这种方法引发的一个 ClassCastException
对象",实际执行情况说明。我的猜测是,这是一个文件的错误。
请参阅报告API变化的java运行环境类库在这里: http://abi-laboratory.pro/java/tracker/timeline/jre/
该报告包括落后的二进制和来源的兼容性分析的Java课程。
该报告是由 japi遵守的检查 工具。
...
另一个有趣的分析JAVA1.0-1.6你可以找到 Japitools JAVA-结果 页。
肖恩作为Reilly所述,一个新的方法可以打破你的代码。除了简单的情况,必须实施一个新方法(这将产生一个编译器的警告)有一个最坏的情况:一个新的方法,在该接口拥有的 同样的签名 作为一个方法你已经在你的课。唯一的提示从编译是一个警告, @Override
注释是缺少(Java5类,注释是支持接口在Java6但是可选择)。
我没有尝试过,但在理论上,这会的工作在Java1.1和破Java1.2.(更多 信息在这里)
public class Test {
float strictfp = 3.1415f;
}
从个人的经验,我们有一些AWT/摆文本田埋在SWT_AWT框架在1.5那不再是编辑之后,升级到1.6.