由于this question回到四票结束,我再次尝试提出一个更为狭隘的问题,希望社群能够更有利地看待。
Java中的哪些特定设计决策被记录为不是因为这是首选的设计决策,而是因为它必须支持向后兼容性。
明显的情况是泛型,在运行时无法检测类型参数。 (所以你做不到:
public void addEmptyMember(List<?> someList) {
if (someList instanceof List<String>) {
((List<String>) someList).add("");
}
}
语言设计和标准API中还有哪些其他例子?
答案 0 :(得分:3)
因为这个问题没有一个正确的答案,我不确定它是否会比你的其他问题更好。
我能想到的三个功能(除了你已经提到的通用擦除之外)以向后兼容的名义做出了妥协,它是新的for循环语法,varargs和autoboxing。
新的for循环语法可能应该已读for (item in List)
,但这需要将in
转换为保留字。这会导致许多向后兼容性问题,其中最重要的是System.in
必须重命名。
Object...
的方法,那意味着该数组应该作为vararg数组传递还是作为vararg数组的一个元素传递?如果有重载,这会变得更加复杂。自动装箱在重载方面存在类似的模糊问题。这两个问题的解决方案是规定,在解析方法调用时,首先使用1.5之前的规则解决它们(即:没有自动装箱,Object...
被视为Object[]
)。只有在使用1.5之前的规则无法解决方法调用时才会考虑新的1.5规则。
答案 1 :(得分:3)
标准库中有很多例子
答案 2 :(得分:2)
另一个是所有现在已弃用多个版本的类和方法,但不会消失。最值得注意的是不推荐使用的各种Thread方法。
答案 3 :(得分:1)