明确完成了哪些Java设计来支持向后兼容性?

时间:2009-06-07 14:36:21

标签: java backwards-compatibility

由于this question回到四票结束,我再次尝试提出一个更为狭隘的问题,希望社群能够更有利地看待。

Java中的哪些特定设计决策被记录为不是因为这是首选的设计决策,而是因为它必须支持向后兼容性。

明显的情况是泛型,在运行时无法检测类型参数。 (所以你做不到:

 public void addEmptyMember(List<?> someList) {
      if (someList instanceof List<String>) {
            ((List<String>) someList).add("");
      }
 }

语言设计和标准API中还有哪些其他例子?

4 个答案:

答案 0 :(得分:3)

因为这个问题没有一个正确的答案,我不确定它是否会比你的其他问题更好。

我能想到的三个功能(除了你已经提到的通用擦除之外)以向后兼容的名义做出了妥协,它是新的for循环语法,varargs和autoboxing。

新的for循环语法可能应该已读for (item in List),但这需要将in转换为保留字。这会导致许多向后兼容性问题,其中最重要的是System.in必须重命名。

varargs和autoboxing都增加了歧义的可能性。例如,如果将一个Objects数组传递给一个接受Object...的方法,那意味着该数组应该作为vararg数组传递还是作为vararg数组的一个元素传递?如果有重载,这会变得更加复杂。自动装箱在重载方面存在类似的模糊问题。这两个问题的解决方案是规定,在解析方法调用时,首先使用1.5之前的规则解决它们(即:没有自动装箱,Object...被视为Object[])。只有在使用1.5之前的规则无法解决方法调用时才会考虑新的1.5规则。

答案 1 :(得分:3)

标准库中有很多例子

  • java.awt.Color具有大小写相同的常量
  • java.util.Date中所有已弃用的方法给出了java.util.Calendar的介绍 - 真是一团糟!!
  • java.util.Enumeration仍然在java.util.Iterator可以替换它的地方使用
  • Swing中接受Vector作为参数但可能为java.util.Collection添加了支持的类

答案 2 :(得分:2)

另一个是所有现在已弃用多个版本的类和方法,但不会消失。最值得注意的是不推荐使用的各种Thread方法。

答案 3 :(得分:1)