Dado que this question ha vuelto a tener cuatro votos para cerrar, trato de volver a hacer una pregunta más limitada que espero que la comunidad vea más favorablemente.¿Qué diseños de Java se hacen explícitamente para respaldar la compatibilidad hacia atrás?
Qué decisiones específicas de diseño en Java se documentan para que no se hagan porque esa fue la decisión de diseño preferida, sino más bien porque era necesario para admitir la compatibilidad con versiones anteriores.
El caso obvio es Generics, donde no se puede detectar el parámetro de tipo en tiempo de ejecución. (Por lo que no puede hacer:
public void addEmptyMember(List<?> someList) {
if (someList instanceof List<String>) {
((List<String>) someList).add("");
}
}
¿Qué otros ejemplos de este tipo existen en el diseño de lenguajes y API estándar
¿Es el tercero realmente elegido por compatibilidad con versiones anteriores como la única razón principal? Me parece que tiene sentido incluso sin tener en cuenta la compatibilidad con versiones anteriores. –
En cualquier implementación de varargs que estaba en el lenguaje desde el principio, querría que hubiera una sintaxis separada para "explotar esta matriz y pasar sus elementos como los argumentos en las varillas".(Por ejemplo, la notación de llamada * args en python, o incluso la función apply en lisp). No querían hacer esto en Java, sin embargo, porque querían poder "actualizar" funciones API existentes para usar varargs mientras tener todas las llamadas antiguas (que esperaban una matriz) para que funcionen. –