Yis*_*hai 6 java backwards-compatibility
由于这个问题又回到四票即将结束,我再次尝试提出一个更为狭隘的问题,希望社群能够更好地看待.
Java中的哪些特定设计决策被记录为不是因为这是首选的设计决策,而是因为必须支持向后兼容性.
显而易见的情况是泛型,您无法在运行时检测类型参数.(所以你做不到:
public void addEmptyMember(List<?> someList) {
if (someList instanceof List<String>) {
((List<String>) someList).add("");
}
}
Run Code Online (Sandbox Code Playgroud)
语言设计和标准API中还有哪些其他类似的例子?
因为这个问题没有唯一的正确答案,所以我不确定它是否会比您的其他问题更好。
我能想到的以向后兼容性为名做出妥协的三个功能(除了您已经提到的通用擦除之外)是新的 for 循环语法、可变参数和自动装箱。
新的 for 循环语法可能应该是 read for (item in List),但这需要制作in成保留字。这将导致许多向后兼容性问题,其中最重要的是System.in必须重命名。
可变参数和自动装箱都增加了歧义的可能性。例如,如果将一个对象数组传递给接受的方法,Object...这是否意味着该数组应该作为 vararg 数组或作为 vararg 数组的元素传递?如果存在过载,情况会变得更加复杂。自动装箱也有与重载类似的歧义问题。这两个问题的解决方案是制定一条规则,即在解析方法调用时,首先使用 1.5 之前的规则进行解析(即:无自动装箱,并被Object...视为Object[])。仅当方法调用无法使用 1.5 之前的规则解决时,才会考虑新的 1.5 规则。