有没有不兼容性之间的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年)

房子的规则:

  • 请参考文献和代码的例子。
  • 请尽量以非常具体的/具体在你的答案。
  • 一类是被标记为@弃用不计作为一个倒退的不相容性。
有帮助吗?

解决方案

兼容性说明的各种版本:

第一个重大的打嗝我记得是的 assert 在Java1.4. 它影响了很多的JUnit码.

其他提示

首先,太阳实际上认为所有的版本你所提到的(其他比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";
    }
}

很明显的命名约定 释放的名字不向后兼容.

  • JAVA1.0(月23,1996年)
  • JAVA1.1(二月19,1997年)
  • J2SE1.2(8月、1998年)
  • J2SE1.3(May8,2000年)
  • J2SE1.4(二月6,2002年)
  • J2SE5.0(30日,2004年)
  • Java SE6(1月1日至2006年)
  • Java SE6更新10、更新12、更新14、更新16
  • Java SE7???JDK7?

(该名单是从维基百科.)

又一个例子。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遵守的检查 工具。

enter image description here

...

enter image description here

另一个有趣的分析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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top