为了支持向后兼容性,明确设计了哪些Java设计?

问题描述:

由于this question已退回四票,所以我想再次提出一个更狭义的问题,希望社区能够更有利地看待。为了支持向后兼容性,明确设计了哪些Java设计?

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

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

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

存在于语言的设计和标准的API

其他什么这样的例子因为这个问题没有一个唯一正确的答案,我不知道?它会票价任何比你的另一个问题。

三个特点,我能想到的(除了一般的删除,您已经提到),在向后兼容的名义作出的妥协是新的for循环语法,可变参数和自动装箱。

The新的for循环语法可能应该已经读取for (item in List),但是这将需要使in成为保留字。这会导致很多向后兼容性问题,其中最重要的是System.in将不得不重新命名。

变量和自动装箱都增加了模糊性的可能性。例如,如果将一个对象数组传递给接受Object...的方法,那么这是否意味着该数组应该作为可变参数数组或可变参数数组的元素传递?如果有重载,这会变得更加复杂。自动装箱在重载方面存在类似的模糊问题。对这两个问题的解决方案是,在解决方法调用时,首先解决它们的前1.5条规则(即:不自动装箱,并且Object...被视为Object[])。只有在方法调用无法用1.5之前的规则解决的情况下,才会考虑新的1.5规则。

+0

作为唯一/主要原因,第三个选项是否真的选择向后兼容?在我看来,即使没有向后兼容性,它也是有意义的。 – 2009-06-07 15:46:42

+4

在开始语言的可变参数的任何实现中,您希望有一个单独的语法来“分解此数组并将其元素作为可变参数中的参数传递”。(例如,* args在python中调用记法,甚至在lisp中调用函数)但是,他们不想在Java中执行此操作,因为他们希望能够“升级”现有的API函数以使用可变参数让所有的老调用者(期望有一个阵列)仍然可以工作。 – 2009-06-07 19:22:51

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

有很多的例子标准库

  • java.awt.Color中有大写和小写的名称相同的常量
  • 所有java.util.Date过时方法给出的介绍java.util.Calendar的 - 一个混乱!
  • 的java.util.Enumeration仍然被用在了java.util.Iterator可以取代它在Swing
  • 类接受向量作为论点,但可能有支持,增加了对java.util.Collection中